JVM GC机制
垃圾收集主要是针对堆和方法区进行。
回收机制:
现在的JVM基本都使用分代回收机制,把堆中内存区域分为新生代,老年代。
新生代:
| Eden(80%) | Survivor0(10%) | Survivor1(10%) |
老年代:
| Old place |
回收算法:
Minor GC:发生在新生代,内存空间小,频繁执行,所以一般执行速度很快。
Full GC(Major GC):Major GC发生在老年代,一般会伴随着一次Minor GC,所以也叫Full GC,一般执行速度较慢。
在新生代中采用复制算法,每个新对象都最先在Eden里,当Eden满了之后(此时两个Survivor都为空),将触发一次Minor GC,Eden里存活的对象就会送到Survivor0中,即 Eden→Survivor0,Eden里对象清空。
下一次Eden区满之后,就将Eden和Survivor0中存活的对象放到Survivor1中,即Eden+Survivor0→Survivor1。下次Eden满了之后,Eden+Survivor1→Survivor0..........................
如此循环,当对象的复制次数达到16次时,对象就会被送到老年代。
当新生代中对象放入老年代,而老年代中空间不足时,将会进行Full GC。
为什么需要Survivor,又为什么需要两个呢?
先假设没有Survivor:
Eden中的对象经历Minor GC后送到Old place,因为Minor GC很频繁,那么Old place很快就被填满了,然后进行Full GC,然而Full GC很消耗时间,会影响程序的执行速度和响应速度。
若增大Old place的空间,虽然Full GC的频率降低了,但是每次Full GC的时间增长了。若减小Old place的空间,Full GC的时间减少,但是频率增加了。
由此可见,增加Survivor的作用是,减少送往老年代的对象,从而降低Full GC的频率。
再假设只有一个Survivor:
Eden中的对象经历Minor GC后送到空的Survivor,此时没有什么问题,再然后又经历Minor GC,此时Survivor中有些对象死亡,而新的对象从Eden中过来,就出现了碎片化的问题。

由此可见,加一个Survivor是不可取的,至少的加两个,那为什么不三个四个呢?我觉得可能是因为新生代和老年代的空间大小比例有关,若增加多了Survivor,则会降低老年代的利用率,所以选择了两个Survivor。
所以设置两个Survivor的原因就是,解决碎片化。
回收器:
新生代:
Serial回收器:
串行回收器,Client 模式下的默认新生代收集器,是一个单线程的回收器,所以对于只有一个CPU来说,利用率最高。
ParNew回收器:
并行回收器,Server 模式下的虚拟机首选新生代收集器,能与CMS回收器配合,是多线程版的Serial,默认开启线程数量与CPU核数相同,可以使用 -XX:ParallelGCThreads 参数来设置线程数。
Parallel Scavenge回收器:
同样是多线程,但是其余回收器都是以缩短“垃圾回收时间”为主,而Parallel Scavenge的目标是达到一个可控制的吞吐量,它被称为“吞吐量优先”收集器。这里的吞吐量指 CPU 用于运行用户代码的时间占总时间的比值。
停顿时间越短就越适合需要与用户交互的程序,良好的响应速度能提升用户体验。而高吞吐量则可以高效率地利用 CPU 时间,尽快完成程序的运算任务,适合在后台运算而不需要太多交互的任务。
老年代:
Serial Old回收器:
同Serial回收器。
Parallel Old回收器:
同Parallel Scavenge回收器。
CMS回收器:
CMS是Concurrent(同时发生的)- Mark(标记)- Sweep(清理),所以此回收器采用标记-清理算法。分为以下四个步骤:
1、初始标记:仅仅只是标记一下 GC Roots 能直接关联到的对象,速度很快,需要停顿。
2、并发标记:进行 GC Roots Tracing 的过程,它在整个回收过程中耗时最长,不需要停顿。
3、重新标记:为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,需要停顿。
4、并发清除:不需要停顿。
在整个过程中耗时最长的并发标记和并发清除过程中,收集器线程都可以与用户线程一起工作,不需要进行停顿。
G1回收器:
G1(Garbage-First),它是一款面向服务端应用的垃圾收集器,在多 CPU 和大内存的场景下有很好的性能。HotSpot 开发团队赋予它的使命是未来可以替换掉 CMS 收集器。
堆被分为新生代和老年代,其它收集器进行收集的范围都是整个新生代或者老年代,而 G1 可以直接对新生代和老年代一起回收。
参考资料:
JVM GC机制的更多相关文章
- JVM GC 机制与性能优化
目录(?)[+] 1 背景介绍 与C/C++相比,JAVA并不要求我们去人为编写代码进行内存回收和垃圾清理.JAVA提供了垃圾回收器(garbage collector)来自动检测对象的作用域),可自 ...
- 理解JVM GC
理解JVM GC对于我们把控Java应用有很大的帮助.下面我从运维角度,把网上的JVM相关的资料整理如下,以加深对JVM GC的理解.如有错误的地方,请看官指正. JVM内存使用分类 JVM的内存分区 ...
- 直击面试,聊聊 GC 机制
前言 文章来源:https://studyidea.cn/ GC 中文直译垃圾回收,是一种回收内存空间避免内存泄漏的机制.当 JVM 内存紧张,通过执行 GC 有效回收内存,转而分配给新对象从而实现内 ...
- 聊聊面试中常问的GC机制
GC 中文直译垃圾回收,是一种回收内存空间避免内存泄漏的机制.当 JVM 内存紧张,通过执行 GC 有效回收内存,转而分配给新对象从而实现内存的再利用. JVM GC 机制虽然无需开发主动参与,减轻不 ...
- 【转载】Java性能优化之JVM GC(垃圾回收机制)
文章来源:https://zhuanlan.zhihu.com/p/25539690 Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我 ...
- JVM的 GC机制和内存管理
GC机制:java垃圾回收机制,垃圾收集器线程(Garbage Collection Thread)在 JVM 处于空闲循环式,会自动回收无用的内存块. 垃圾收集算法:1.引用计数 2.根搜索 3 ...
- JVM内存管理及GC机制
一.概述 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露 ...
- 深入JVM系列(二)之GC机制、收集器与GC调优
一.回想JVM内存分配 须要了解很多其它内存模式与内存分配的,请看 深入JVM系列(一)之内存模型与内存分配 1.1.内存分配: 1.对象优先在EDEN分配 2.大对象直接进入老年代 3.长期存活的 ...
- Java性能优化之JVM GC(垃圾回收机制)
Java的性能优化,整理出一篇文章,供以后温故知新. JVM GC(垃圾回收机制) 在学习Java GC 之前,我们需要记住一个单词:stop-the-world .它会在任何一种GC算法中发生.st ...
随机推荐
- springboot整合ueditor 前后端分离
1.下载ueditor,百度搜索ueditor,下载 前端用的是Jsp版,导入文件如下 由于要修改部分源码,所以后端用的源码版,导入文件如下 2.配置路径,用来找到json文件 配置前端ueditor ...
- 基于IntelliJ IDEA开发工具搭建SSM框架并实现页面登录功能详细讲解二
接: 接下来配置类 UserController package com.chatRotbot.controller; import com.chatRotbot.model.User; import ...
- 对yolo与fasterrcnn anchors的理解
yolo: 通过聚类产生5个不同比例的anchors.最后一个特征层的输出(x,y,w,h)与这些不同比列的相乘,将网络层的输出转化为bbox(小尺寸),再通过(H,W)还原成原图大小.一共有5个bb ...
- JVM概念以及常用设置
DAY 1 Jvm- java虚拟机 类加载子系统 加载class文件到方法区 方法区 存放类信息 常量信息 常量池信息 辅助堆栈的永久区,解决堆栈信息的产生,是先决条件 3. Java堆(重要) ...
- styled-components的基本使用
一.官网地址 https://www.styled-components.com/ 二.styled-components 1.styled-components 样式化组件,主要作用是它可以编写实际 ...
- 使用 <embed> 标签显示 flash文件(swf)格式 ,如何设置 width 和 height 宽度,高度.
1. embed 标签 支持 .swf 格式. .flv 的不支持. 2. 通常情况下, 网站中上传 多个 flash文件. 它的默认大小是不一样的. 而且 可以 宽度 大于 高度(横向的) ...
- maven项目-修复Plugin execution not covered by lifecycle configuration: org.codehaus.mojo:build-helper-maven-plugin:1.8:add-resource (execution: add-resource, phase: generate-resources) pom.xml报错
1:pom.xml代码 <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build- ...
- 关于jQuery实现CheckBox全选只能生效一次的问题
//这代码只有一次全选.全不选的效果 第三次点击checkall会没有任何效果 $("#checkall").click(function(){ $('input[name=&qu ...
- 剑指Offer 65. 矩阵中的路径 (回溯)
题目描述 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- 使用Axure做验证码之获取验证码(一)
本次作业,制作验证码,仅完成获取验证码操作,如下: 分析: 左图为矩形,主要展示验证码(本例设置4位验证码),其中验证码为字母和数字组合: 右图为文本输入框,主要设置点击事件,即点击文本文字,矩形框中 ...