深入了解G1 GC

  • G1 GC采用递增、并行运算、独占式运算的特征方式,并采用拷贝技术实现自身的压缩目标。同时,通过并行的多级标记方式缩短各层级(标记、重标记、清除等阶段)的停顿时间。

一. G1 GC概念简述

  1. 背景知识
    G1回收器本着取代CMS回收器的长远目标,在JDK1.7中将G1回收器投入使用。

    从堆结构可知,G1不要求整个Eden区、年轻代或者老年代包含的Region区在物理上都是连续的(由传统的物理结构上的连续转为逻辑结构上的连续,即通过Region的动态分配方式实现)。
    在这里插入图片描述

    特点:

    • 并行性:G1回收期间,可有多个线程同时工作,可有效利用多核计算的能力;
    • 并发性:G1拥有与应用程序交替执行的能力,部分工作可以同时和应用程序同时执行,故发生完全阻塞的情况极少。
    • 分代GC:同时兼顾年轻代和老年代;
    • 空间整理:G1在回收过程中会进行适当的对象移动,有效的复制对象,减少空间碎片的产生;
    • 可预见性:由于分区的原因,G1可以只选取部分区域进行内存回收。
  2. G1的垃圾回收机制

    设计目标
    G1 GC在回收暂停阶段会回收最大量的堆内区间(Region),通过回收区间达到回收垃圾的目的。
    唯一的例外:若清除步骤发现所有的区间都是由可回收垃圾组成的,则立即回收这些区间,并将这些区间插入到一个LinkedList实现的空闲队列里。这是G1 GC和其他GC的最大差别

    垃圾回收循环的类型组成
    年轻代循环、多步骤并行标记循环、混合收集循环。

    在年轻代回收期,G1 GC暂停应用程序线程,然后从年轻代区间移动存活对象到幸存者区间或老年代区间,也可能两个区间都涉及。
    混合回收期,G1 GC从老年代区间移动存活对象到空闲区间,这些空闲区间也就成为老年代的一部分。

  3. G1的区间设计灵感

二. G1 GC分代管理

  • G1 GC的收集过程包括:年轻代GC、并发标记周期、混合收集、Full GC。
  1. 年轻代
    绝大多数的对象会被分配在本地线程的本地分配缓存(TLAB)里面;
    若对象比TLAB所能存储的对象大,则此对象被当作大对象(Humongous),存储到大对象区间(Humongous Region);
    若对象介于TLAB所能存储的对象和大对象之间,会有特定线程处理。

    年轻代的大小及停顿时间设置:

    最小值最大值停顿时间
    默认值Java堆的5%Java堆的60%200ms
    手动设置-XX:G1NewSizePercent-XX:G1MaxNewSizePercent-XX:MaxGCPauseMills

    年轻代最大空间未达到前,G1 GC会根据Java应用对象的分配速率,从空闲区间里面挑选出区间加入年轻代。堆区间大小是2的倍数,且在1MB到32MB不等。JVM最多可容纳约2048个区间,每个区间大小可通过-XX:G1HeapRegionSize设置。

  2. 年轻代回收暂停
    年轻代由 Eden和Survivor区组成。当Eden区内存完全被占满时,GC先把所有的存活对象拷贝到Survivor区,再进行回收。
    每次年轻代回收暂停期间,G1 GC计算当前年轻代大小需要扩张或压缩的总量,回收暂停结束后会重新调整年轻代。

  3. 大对象区间
    由于大对象在堆内存里是物理连续的,故频繁回收大对象存在两个缺点:移动对象需要拷贝对象,拷贝大对象的效率会成为瓶颈;很难找到连续的堆内存来存储大对象,回收越频繁,越容易出现相互独立的区间。

  4. 混合回收暂停

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值