初探G1垃圾回收器

2023-07-31 jvm

# 为什么使用G1?

  1. 在G1之前,垃圾回收器停止工作线程STW的时间是不可控的,停多久没人知道,C1就是为了解决这种问题,针对STW可以自定义停多久,默认是200ms
  2. 解决内存碎片化问题
    • 例如cms使用标记-清除算法会产生内存碎片,需要专门解决。
    • G1采用”整体+局部"的设计方式避免内存碎片化
    • 整体:基于标记-整理实现垃圾回收
    • 局部:把整个堆切割为大小均匀的多个Region,Region间使用标记-复制算法,详见后文
  3. 年轻代老年代通吃:以往jvm的垃圾回收都要分别为年轻代、老年代分别设置垃圾回收器,从G1开始就不用了
  4. 建议使用在大应用上,服务器配置一般要求内存大于4G

# G1的内存模型

G1的内存模型有几个重要的概念:

  1. 分区Region:G1把堆内存分割为多个大小相等的独立区域(Region),每个Region都可以根据需要,扮演年轻代或老年代角色。
  2. CardTable技术:每个Region中都有一个cardTable,记录着堆内存的内存分配情况,通过CardTable可以找到Region内对象所引用的对象,被引用的对象可以是别的Region。
  3. RSet:每个Region都有一个RSet集合,通过RSet可以找到当前Region内对象被谁所引用,以此判断其是否存活。
  4. CSet:CSet用于存储不存活的对象,年轻代收集CSet只容纳年轻代分区,混合收集会通过启发式算法,在老年代候选回收分区中,筛选出回收收益最高的分区添加到CSet中。
  5. Humongous:一种对象分配方式,用于处理超大对象,会直接分配在老年代,GC触发和寻常对象有所不同。

听不懂?听不懂没关系下一篇会详细介绍。

上次更新: 6 个月前