G1垃圾回收器
垃圾回收器发展史
G1最大的特征
将大空间分成若干小区域能实现一些更复杂、更精细的功能
G1与传统模型对比
G1由JDK7引入,Java8基本成熟,JDK9称为默认垃圾回收器,JDK14删除CMS,G1登基
划分成小区域的好处
- 垃圾回收线程和工作线程能够并行工作,避免“STW
- 不同区域可同时回收,并发性更高,更适合多核服务器
- 可以先回收一部分区域,回收更快
- 可以建立停顿预测模型,用户可以设定垃圾回收最长时间
G1对象管理
年轻代垃圾回收
Region划分原理
大对象分区(H区)
新生代与老年代占比
新生代大约占整个堆的1/3,老年代占比大约剩余的2/3
也有说新生代占堆比例是动态变化的最小5%,然后慢慢增加到60%
如何设置分区大小
-XX:G1HeapRegionSize=4M
此命令可以设置region区大小为4M,分区最大可以设置32M
G1三种垃圾回收策略的原理
- 新生代回收原理
- 混合回收原理
- Ful回收原理
- 大对象回收
新生代满了就会触发新生代回收,只回收新生代
前提新生代满了并且老年代占用达到阈值会触发混合回收,先执行新生代回收和再执行老年代回收
当混合回收后对象仍无法分配会触发Full GC
几个容易混淆的概念
YGC新生代回收的基本过程
YGC的基本过程一
标记存活对象:从GCroots出发标记存活对象
GCroots有哪些?
YGC的基本过程二
复制存活对象到S区,该过程最耗时
YGC的基本过程三
释放垃圾集合,回收region;该工作反而比较快,类似硬盘格式化。
YGC的基本过程四
YGC的基本过程五
堆空间使用超过45%
YGC里并行执行的任务
YGC里串行执行的任务
G1垃圾收集器停顿预测模型
G1收集器突出表现出来的一点是通过一个停顿预测模型根据用户配置的停顿时间来选择Cset的大小,从而达到用户期待的应用程序暂停时间
通过-XX:MaxGCPauseMillis参数来设置,这一点有点类似于Parallel Scavenge收集器.关于停顿时间的设置并不是越短越好
设置的时间越短意味着每次收集的Cset越小,导致垃圾逐步积累变多,最终不得不退化成Serial GC;
停顿时间设置的过长,那么会导致每次都会产生长时间的停顿,影响了程序对外的响应时间
G1的衰减预测模型
垃圾回收的时间花到哪里了?
真正决定回收时间的就是转移对象所需要的时间甚至可以直接简化为回收时间=对象转移时间
混合回收和后面的FUII回收都是同时处理新生代和老年代区域
对象什么时候进入老年代
混合回收什么时候发生?
通过参数可调整触发时机
混合回收基本步骤
混合回收的并发标记为什么从YGC开始
YGC与MixedGC是什么关系