JVM 系列笔记目录
- 虚拟机的根底概念
- class 文件构造
- class 文件加载过程
- jvm 内存模型
- JVM 罕用指令
- GC 与调优
次要内容
上一篇 JVM 系列【6】GC 与调优 3 记录 JVM 调优的概念和剖析案例。这篇次要讲 G1 垃圾回收器、三色标记算法。
G1 垃圾回收器
-
概念
G1(Garbage First) 是服务端应用的垃圾回收器,用于多核、大内存的机器上,在大多数状况下能够实现指定的 GC 进展工夫,同时还放弃较高的吞吐量。不同于之前的分代垃圾回收器,G1 是逻辑上分代,物理上不分代。内存分为一个一个 Region,有 Eden 区、Survivor 区、Old 区、还有 Humongous 区。
特点:并发回收;压缩闲暇工夫不会缩短 GC 的暂停工夫;更易预测的 GC 暂停工夫;实用不须要很高的吞吐量的场景。
长处:谋求吐吞量;谋求响应工夫: 能够对 STW 进行管制;灵便:分 Region 回收,优先回收破费工夫少、垃圾比例高的 Region。
- CSet 和 RSet
CSet(Collection Set):G1 一组可被回收的分区的汇合; 在 CSet 中存活的数据会在 GC 过程中被挪动到另一个可用分区;CSet 中的分区能够来自 Eden 空间、survivor 空间或者老年代;CSet 中的分区能够来自 Eden 空间、survivor 空间或者老年代。
RSet(RememberedSet):记录了其它 Region 中的对象到本 region 的援用;价值在于使得垃圾回收器不须要扫描整个堆就能找到谁援用了以后分区中的对象,只须要扫描 RSet 即可
理解:RSet 与赋值的效率,因为 RSet 的存在,那么每次给对象赋值援用的时候,就得做一些额定的操作,指的是在 RSet 中做一下额定的记录 (在 GC 中称为写屏障),这个写屏障不等于内存屏障。
- 新老年代的比例
G1 中新老年代的比例为 5%-60%,个别不必手工指定,也不要手动指定,因为这是 G1 预测进展工夫的基准,G1 去管制和预测 STW 就是通过动静调整这个比例来实现的。
- Region 有多大?
G1 中 Region 不指定的时候,会依据理论的 Heap 大小来设定,取值范畴为 1 2 4 8 16 32M,设置参数为
-XX:G1HeapRegionSize
-
G1 中的垃圾回收
分 YGC、FGC、Mixed GC 类型。
YGC:Eden 空间有余触发,多线程并发执行。
FGC:Old 空间有余触发
Mixed GC:相当于 CMS 的回收过程,初始标记、并发标记、最终标记、筛选回收。触发 Mixed GC 的参数是
-XX:InitiatingHeapOccupacyPercent
,默认为 45%,当 O 区超过这个值启动 MixedGC。 -
G1 是并行回收是否存在 FGC?
当调配对象十分快,回收不过去的状况下会产生 FGC,jdk10 以前是串行 FullGC,之后是并行的 FGC;
如何防止 FGC?
升高 MixedGC 的触发始终,让 MixedGC 提前产生 (默认是 45%);扩内存;进步 CPU 性能 (回收得快,业务逻辑产生对象的速度固定,垃圾回收越快,内存空间越大)。
三色标记法
- 三色的含意:
红色指的是未被标记的对象,灰色指本身被标记,成员变量未被标记的对象,彩色指本身和成员变量都已标记实现的对象。
- 漏标
CMS 和 G1 在垃圾标记的过程中存在一个难点: 在标记对象的过程中,对象的援用关系正在发生变化,会产生漏标的景象。漏标产生的充沛必要条件:在 remark 过程中,彩色指向了红色,如果不对彩色从新扫描,则会漏标,会把红色 D 对象当做没有新援用指向从而回收掉;并发标记过程中,删除了所有从灰色到红色的援用,则会产生漏标,此时红色对象应该被回收,D 漏标。
- 如何解决漏标
CMS 用的是 Incremental Update 算法,增量更新,关注援用的减少,A->D,把彩色从新标记为灰色,下次从新扫描 A 的属性。
G1 用的是 SATB(snapshot at the beginning),关注援用的删除,当 B ->D 援用隐没时,要把这个“援用”推到 GC 的堆栈,保障 D 还能被 GC 扫描到。
为什么 G1 应用 STAB?当 B ->D 援用隐没时,会把这个援用推到 GC 的堆栈,下次扫描时候会拿到这个援用,因为有 RSet 的存在,不须要扫描整个堆去查找红色的援用,效率比拟高。
- 总结
CMS 应用的并发标记算法是三色标记 +Incremental Update
CMS 应用的并发标记算法是三色标记 +SATB
常识分享,转载请注明出处。学无先后,达者为先!