【HBZ分享】G1垃圾回收器的原理

G1垃圾回收器的核心

  1. 保留分代思想,整堆中会被划分成2048region块,这些region从逻辑上包含Eden, Survivor, Old,Humongous区域,注意只是逻辑上划分的,并不是说某个region就一定是E区或O区。
  2. 取消了Young和Old的明确物理划分界限,以上4个区域是动态随机划分在整个堆当中的。
  3. 每个Region充当的角色也是动态变化的,可能现在是Young区,但不久后就变成了Old区
  4. 从整体上看,属于标记-压缩算法。从局部看是复制算法,因此不会产生内存随便。
  5. 整个堆会被划分成2048个region, 每个region的大小由堆空间决定,堆空间大,每个region就会大一些。每个region会在1M-32M这个范围内,并且是2的N次幂的形式。
    • 每个region的大小设置可以通过参数: -XX:G1HeapRegionSize来进行设置
  6. 新增一个Humongous区域,它叫巨型对象区域,专门存储大对象的,可以认为是老年代Old。
  7. 大对象的定义:当对象大小超过1.5个Region的时候,会被定义为大对象,会存储到H区
  8. 如果1个region装不下大对象,则G1会找连续的H区来存储,如果找不到连续的H区,就会触发Full GC, 因此我们一般会认为,大对象也是老年代

G1垃圾回收器的3中回收模式

  1. Young GC:

    • 依然采用复制算法,但需要注意的是,并不是某个Eden区域满了就会触发Young GC, 也不是要所有Eden区块满了才会触发GC
    • G1会进行预估,如果垃圾回收时间接近了设置的每次GC的时间,才会进行触发Young GC, 默认的一次垃圾回收时间为200ms。
    • 可以通过-XX:MaxGCPauseMills来设置每次垃圾回收的时间。
    • 回收过程就是将Eden区和Survivor区的存活对象移动到空闲的Survivor区,然后将整个region进行清除。
    • 如果Survivor也都满了,则G1会将存活对象复制到Old区域。
    • Young GC是STW的
  2. MixedGC:

    • 这是一种混合GC,即会回收整个年轻代 + 部分老年代, 注意是部分老年代,不是全部。因此性能比Young GC低,但是比Full GC高
    • 触发条件:
      (1). 由-XX:InitiatingHeapOccupancyPercent=n来决定
      (2). 默认n=45%, 即当老年代大小占【整个堆】大小的百分比达到了%45时触发MixedGC
  3. Full GC

    • 单线程对整个区域所有代进行标记, 清除,以及整理压缩动作,非常耗时。

G1垃圾回收器执行时的步骤:

  1. 初始标记(STW): 把所有和GCRoot之间关联的对象进行标记,不会标记间接关联的对象。这个过程会进行一次Young GC, 速度很快,是为了后面步骤标记进行减负,防止后面的动作要标记太多的对象。
  2. 并发标记: 和工作线程一同工作,以初始标记出的那些直接与GCRoot关联的对象为起始点,并发的对所有存活的对象进行标记,并且会记录他们所在的region。
  3. 最终标记(STW): 修正并发标记步骤的过程中产生的对象状态变化,可能有些对象已经死了, 可能还会有些新生的对象,这里再做一次扫描。根据算法修复一些引用的状态
  4. 筛选回收(STW): 这里有学问。
    • 首先会对回收的价值 和 成本进行排序,即根据回收每个region的性价比排一个顺序,然后根据用户所指定的每次垃圾回收的时间-XX:MaxGCPauseMills来定制一个回收计划。
    • 成本排序案例:
      (1). 现有Region1, Region2, Region3这3个区域
      (2). Region1回收1.5M, 预计耗时2MS, 投产比就是1.5 / 2
      (3). Region2回收1M, 预计耗时1MS, 投产比就是1 / 1
      (4). Region3回收0.5M,预计耗时1MS, 投产比就是 0.5 / 1
      (5). 那这3个区域的投产比分别是: 0.75, 1 和 0.5
      (6). 比值越高,表示收益越高,性价比越高,如果每次只能回收1个Region,那么就会回收Region2的空间。
  • 23
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值