JVM七大垃圾回收器之 G1

2020-08-30  本文已影响0人  南园故剑00

G1回收过程:年轻代GC

  1. 扫描根
    根是指static变量指向的对象,正在执行的方法调用链条上的局部变量等。根引用连同Rset记录的外部引用作为扫描存活对象的入口。
  2. 更新RSet
    处理Dirty cardqueue 中的card,更新Rset。此阶段后,RSet可以准确的反映老年代对所在内存分段中对象的引用。
  3. 处理Rset
    识别被老年代对象指向的eden中的对象,这些被指向的eden中的对象被认为是存活的对象。
  4. 复制对象
    此阶段对象树被遍历,eden内存段中存活的对象会被复制到survivor区中空的内存分段,Survivor区内存段中存活的对象如果年龄未达到阈值,年龄会+1,达到阈值会被复制到old区域中空的内存分段。如果survivor空间不够,eden空间的部分数据会直接晋升到老年代空间。
  5. 处理引用
    处理soft、weak、phantom、final、JNI Weak等引用。最终eden空间的数据为空,GC停止工作,而目标内存中的对象都是连续存储的,没有碎片,所以复制过程中可以达到内存整理的效果,较少碎片。
  1. 初始标记阶段:标记从根节点直接可达的对象。STW,并会触发一次年轻代GC。
  2. 根区域扫描:G1 GC扫描survivor区直接可达的老年代区域对象,并标记被引用的对象。这个过程必须在young GC之前完成。
  3. 并发标记:在整个堆中进行并发标记,此过程可能被young GC中断。在并发标记阶段,若发现区域对象中的所有对象都是垃圾,那这个区域会被立即回收。同时,并发标记过程中,会计算每个区域的对象活性(区域中存活对象的比例)
  4. 再次标记:由于应用程序持续进行,需要修正上一次的标记结果。是STW的。G1采用了比CMS更快的初始快照算法:snapshot-at-the-beginning SATB
  5. 独占清理:计算各个区域的存活对象和GC回收比例,并进行排序,识别可以混合回收的区域,为下阶段做铺垫。是STW的。这个阶段并不会实际去做垃圾的收集。
  6. 并发清理阶段:识别并清理完全空闲的区域。









上一篇 下一篇

猜你喜欢

热点阅读