-
G1 GC采用递增、并行运算、独占式运算的特征方式,并采用拷贝技术实现自身的压缩目标。同时,通过并行的多级标记方式缩短各层级(标记、重标记、清除等阶段)的停顿时间。
一. G1 GC概念简述
-
背景知识
G1回收器本着取代CMS回收器的长远目标,在JDK1.7中将G1回收器投入使用。从堆结构可知,G1不要求整个Eden区、年轻代或者老年代包含的Region区在物理上都是连续的(由传统的物理结构上的连续转为逻辑结构上的连续,即通过Region的动态分配方式实现)。

特点:
- 并行性:G1回收期间,可有多个线程同时工作,可有效利用多核计算的能力;
- 并发性:G1拥有与应用程序交替执行的能力,部分工作可以同时和应用程序同时执行,故发生完全阻塞的情况极少。
- 分代GC:同时兼顾年轻代和老年代;
- 空间整理:G1在回收过程中会进行适当的对象移动,有效的复制对象,减少空间碎片的产生;
- 可预见性:由于分区的原因,G1可以只选取部分区域进行内存回收。
-
G1的垃圾回收机制
「设计目标」
G1 GC在回收暂停阶段会回收最大量的堆内区间(Region),通过回收区间达到回收垃圾的目的。
唯一的例外:若清除步骤发现所有的区间都是由可回收垃圾组成的,则立即回收这些区间,并将这些区间插入到一个LinkedList实现的空闲队列里。这是G1 GC和其他GC的最大差别。「垃圾回收循环的类型组成」
年轻代循环、多步骤并行标记循环、混合收集循环。在年轻代回收期,G1 GC暂停应用程序线程,然后从年轻代区间移动存活对象到幸存者区间或老年代区间,也可能两个区间都涉及。
混合回收期,G1 GC从老年代区间移动存活对象到空闲区间,这些空闲区间也就成为老年代的一部分。 -
G1的区间设计灵感
二. G1 GC分代管理
-
G1 GC的收集过程包括:年轻代GC、并发标记周期、混合收集、Full GC。
-
年轻代
绝大多数的对象会被分配在本地线程的本地分配缓存(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设置。 -
年轻代回收暂停
年轻代由 Eden和Survivor区组成。当Eden区内存完全被占满时,GC先把所有的存活对象拷贝到Survivor区,再进行回收。
每次年轻代回收暂停期间,G1 GC计算当前年轻代大小需要扩张或压缩的总量,回收暂停结束后会重新调整年轻代。 -
大对象区间
由于大对象在堆内存里是物理连续的,故频繁回收大对象存在两个缺点:移动对象需要拷贝对象,拷贝大对象的效率会成为瓶颈;很难找到连续的堆内存来存储大对象,回收越频繁,越容易出现相互独立的区间。 -
混合回收暂停
1489

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



