这几天花时间完成了标记-清除算法、标记-整理算法、标记-复制算法,还算顺利。今天准备动手写G1,整理思路过程中发现G1涉及到的概念相当多而且还难以理解,网上的文章、相关书籍对相关概念的解释相对比较孤立、比较简洁,需要结合很多资料串起来想才能想明白。防止后面忘记,也为了保证G1的顺利完成,码点文字把这点明白记录下来。
JVM的内存结构是由垃圾回收算法决定的。
Region
G1及其后出现的垃圾收集器ZGC、Shenandoah,它们都是基于Region的内存布局形式。它们垃圾收集的目标范围不再是整个新生代(Minor GC)、老年代(Majon GV)、整个堆(Full GC),而是一个一个的Region。因为这样的内存布局,所以G1能做到面向局部收集。
每个Region都可以被标记为E(Eden)、S(Survivor)、O(Old)、H(Humongous),但一个Region同一时刻只能是这四个中的一个。H表示巨型对象,即超过Region大小的一半的对象,会直接进入老年代由多个连续的Region存储。
Region的大小可以通过-XX:G1HeapRegionSize参数指定,如果没有显示指定,则G1会计算出一个合理的大小。Region的取值范围为1M~32M,且应为2的N次幂,所以Region的大小只能是1M、2M、4M、8M、16M、32M。比如-Xmx=16g -Xms=16g,则Region的大小等于16G / 2048=8M。也可以推理出G1推荐的管理的最大堆内存是64G。

RSet(Remembered Set、记忆集)
在垃圾收集过程中,会存在一种现象,即跨代引用,在G1中,又叫跨Region引用。如果是年轻代指向老年代的引用我们不用关心,因为即使Minor GC把年轻代的对象清理掉了,程序依然能正常运行

本文深入探讨了G1垃圾回收器的工作原理,包括Region内存布局、RSet及CardTable的作用与实现细节,并概述了G1算法的优势。
最低0.47元/天 解锁文章
1416

被折叠的 条评论
为什么被折叠?



