
























G1回收过程:年轻代GC
- 扫描根
根是指static变量指向的对象,正在执行的方法调用链条上的局部变量等。根引用连同Rset记录的外部引用作为扫描存活对象的入口。 - 更新RSet
处理Dirty cardqueue 中的card,更新Rset。此阶段后,RSet可以准确的反映老年代对所在内存分段中对象的引用。 - 处理Rset
识别被老年代对象指向的eden中的对象,这些被指向的eden中的对象被认为是存活的对象。 - 复制对象
此阶段对象树被遍历,eden内存段中存活的对象会被复制到survivor区中空的内存分段,Survivor区内存段中存活的对象如果年龄未达到阈值,年龄会+1,达到阈值会被复制到old区域中空的内存分段。如果survivor空间不够,eden空间的部分数据会直接晋升到老年代空间。 - 处理引用
处理soft、weak、phantom、final、JNI Weak等引用。最终eden空间的数据为空,GC停止工作,而目标内存中的对象都是连续存储的,没有碎片,所以复制过程中可以达到内存整理的效果,较少碎片。

- 初始标记阶段:标记从根节点直接可达的对象。STW,并会触发一次年轻代GC。
- 根区域扫描:G1 GC扫描survivor区直接可达的老年代区域对象,并标记被引用的对象。这个过程必须在young GC之前完成。
- 并发标记:在整个堆中进行并发标记,此过程可能被young GC中断。在并发标记阶段,若发现区域对象中的所有对象都是垃圾,那这个区域会被立即回收。同时,并发标记过程中,会计算每个区域的对象活性(区域中存活对象的比例)
- 再次标记:由于应用程序持续进行,需要修正上一次的标记结果。是STW的。G1采用了比CMS更快的初始快照算法:snapshot-at-the-beginning SATB
- 独占清理:计算各个区域的存活对象和GC回收比例,并进行排序,识别可以混合回收的区域,为下阶段做铺垫。是STW的。这个阶段并不会实际去做垃圾的收集。
-
并发清理阶段:识别并清理完全空闲的区域。















网友评论