G1详解
1.什么是G1
G1是一种服务端应用使用的垃圾收集器,目标是用在多核、大内存的机器上,它在大多数情况下可以实现指定的GC暂停时间,同时还能保持较高的吞吐量
参考链接:https://www.oracle.com/technical-resources/articles/java/g1gc.html
2.G1的特点
1.并发收集
2.压缩空闲空间不会延长GC的暂停时间
3.更易预测的GC暂停时间
4.适用不需要实现很高的吞吐量的场景
5.更加灵活,分Region回收,优先回收花费时间少、垃圾比例高的Region
3.G1逻辑分代模型
每个分区都可能是年轻代也可能是老年代,但是在同一时刻只能属于某个代。年轻代、幸存区、老年代这些概念还存在,成为逻辑上的概念,这样方便复用之前分代框架的逻辑。在物理上不需要连续,则带来了额外的好处——有的分区内垃圾对象特别多,有的分区内垃圾对象很少,G1会优先回收垃圾对象特别多的分区,这样可以花费较少的时间来回收这些分区的垃圾,这也就是G1名字的由来,即首先收集垃圾最多的分区。新生代其实并不是适用于这种算法的,依然是在新生代满了的时候,对整个新生代进行回收——整个新生代中的对象要么被回收、要么晋升,至于新生代也采取分区机制的原因,则是因为这样跟老年代的策略统一,方便调整代的大小。G1还是一种带压缩的收集器,在回收老年代的分区时,是将存活的对象从一个分区拷贝到另一个可用分区,这个拷贝的过程就实现了局部的压缩。每个分区的大小从1M到32M不等,但是都是2的冥次方。
- Collection Set
简称CSet。一组可被回收的分区的集合。在CSet中存活的数据会在GC过程中被移动到另一个可用分区,CSet中的分区可以来自Eden空间、survivor空间、或者老年代。CSet会占用不到整个堆空间的1%大小。
-
RememberedSet
简称RSet。记录了其他Region中的对象到本Region的引用RSet的价值在于使得垃圾收集器不需要扫描整个堆找到谁引用了当前分区中的对象,只需要扫描RSet即可。
由于RSet 的存在,那么每次给对象赋引用的时候,就得做一些额外的操作,在RSet中做一些额外的记录(在GC中被称为写屏障),这个写屏障 不等于 内存屏障
-
Region的大小
Region的取值1,2,4,8,16,32
可以手工指定-XX:G1HeapRegionSize
-
新老年代比例
5% - 60%:一般不用手工指定也不要手工指定,因为这是G1预测停顿时间的基准
-
humongous object
超过单个region的50%被称为大对象
4.G1中的GC
-
MixedGC
和CMS过程一样,并发标记的过程采用三色标记+SATB
XX:InitiatingHeapOccupacyPercent:默认值45%,当O超过这个值时,启动MixedGC
-
FGC
java 10以前是串行FullGC,之后是并行FullGC