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
常识分享,转载请注明出处。学无先后,达者为先!
发表回复