JVM-GC-G1垃圾回收器
基本概念
card table
- card table概念是为了解决新生代对象进入老年代时,在进行新生代扫描的时候会遍历老年代对象的问题。
- 将内存分为多个card,如果在一个老年代card中存在引用新生代对象的对象,则将该区域标记及为dirty card。
CSet(collection set)
用来记录可以被回收的card,即通过算法计算出垃圾多的card;
RSet(RememberedSet)
它是一个HashMap,记录其他Regin中的对象指向本Regin中的引用。这样不用扫描整个堆就可以知道当前谁引用了当前分区中的对象,只需要扫描RSet即可。
MixedGC
当堆内存空间达到一定的阈值,会触发MixedGC,和CMS回收步骤相似。这个阈值可以通过XX:InitiatingHeapOccupacyPercent参数设置,默认45%
G1的特点
- 只有逻辑分代的概念,实际内存空间不再分代。因此内存中的空间可以属于新生代、老年代等任何一种。
- 将内存分而治之,将内存分块处理,每块内存称为一个Region。
- garbage first,垃圾优先,意思是优先回收垃圾数据多的内存块儿。
- 并发收集
- 吞吐量比PS+PO低,适用于不需要吞吐量的业务。
G1的回收阶段
YGC、MixedGC、FGC。G1的调优是尽量不要FGC。
G1如何解决漏标问题
- SATB + RSet解决漏标问题
- SATB(snapshot at the beginning):关注引用的删除
- 如果一个灰色对象中的引用被删除,JVM将此引用推向GC的堆栈中,保证能被GC扫描到