G1
概念
是一种同时具备低延时和高吞吐的并发垃圾收集器
物理上不再使用以前的新生代、老年代划分,而是使用一个个的region对整块内存做逻辑上的区分
G1对CPU和内存的要求比较高
Region
一共有2048个Region,每个Region的大小为1M至32M
Region的实际大小 = JVM分配的内存大小/2048
Region的类型
Eden
Survivor
Old
Eden和Survivor的比例依然是8:1:1,新生代与老年代的占比是动态调整的
GC过程
初始标记:找到GC Roots直接引用的对象,STW
并发标记:从GC Roots向下寻址,标记存活对象
最终标记:修改并发标记阶段由用户线程运行导致变动的对象,STW
筛选回收:对回收价值进行排序,并根据期望停顿时间,回收最有价值的Region中的垃圾对象
与CMS的区别
G1不再使用原始的分代模型,而是使用一个个的Region来保存对象
G1的回收阶段是并行执行的,CMS是并发执行的
并行执行垃圾回收效率更高
G1的回收可以根据配置的停顿时间选择性的回收Region,不需要做全量回收
回收模式
Young GC
根据配置的停顿时间做GC,会先计算本次GC需要的时间,如果远小于配置的停顿时间,会先增大Eden的占用比例,直到某次回收的时间接近配置的停顿时间时,才会做Young GC
Mixed GC
老年代对象达到需要回收的比例后就会执行,回收整个新生代和老年代,此时使用的是复制回收算法,如果复制时内存不够,就会Full GC
Full GC
使用单线程标记、整理内存,非常耗时