一、G1简介
G1 不同于以往的收集器,G1将堆拆分成一系列的分区(Heap Region),针对于多核处理器、大堆的服务器场景。它可以满足短停顿的同时支持高吞吐量。分区(HR)是G1堆空间的最小管理单位,HR数量默认为2048。它仍然属于分代收集器,只不过分成了按区域进行管理。
G1分区的所有类别:
typedef enum {
FreeTag = 0,
EdenTag = 2,
SurvTag = 3,
StartsHumongousTag = 12,
ContinuesHumongousTag = 13,
OldTag = 16,
OpenArchiveTag = 56,
ClosedArchiveTag = 57
} Tag;
开发人员仅仅需要声明以下参数即可:-XX:+UseG1GC -Xmx32g -XX:MaxGCPauseMillis=200 (注意这个时间,可以设置大一点,小了容易引起频繁GC)
推荐G1的使用场景
G1的首要关注点是为用户运行那些需要大量堆但垃圾回收延迟有限的应用程序提供一个解决方案。这意味着堆大小为6GB或者更高,并且稳定和可预测的暂停时间低于0.5秒。
现在采用CMS或者并行年老代垃圾回收的应用程序将从切换到G1收益,如果应用程序有以下特征的一个或者多个:
- 完整垃圾回收的持续时间太长或者太频繁
- 对象分配率或者晋升(由年轻代移到年老代)率变化显著
- 不期望的较长的垃圾回收或者压缩暂停(长于0.5到1秒钟)
注意:如果你正使用CMS或者并行年老代垃圾回收,并且你的应用没有经历长时间的垃圾回收暂停,它在当前的垃圾回收器下工作很好。那么,变更为G1垃圾回收器对使用最新版本的JDK并不是个要求。
二、日志分析
1. Young GC
GC pause (G1 Evacuation Pause) — 疏散停顿(Evacuation Pause)是将活着的对象从一个区域(young or young + old)拷贝到另一个区域的阶段
(young) — 表示这是一个 Young GC 事件
GC Workers: 23 – 表示 GC 的工作线程是 23 个。
real=0.02 secs – 注意这里的 real
时间,它表示 GC 总共花了 0.02 秒
eden回收后,空间增长到 1662mb,但是没有提交
2. Mixed GC
Mixed GC指的不是一次GC,而是一个过程,这个过程从initial-mark
开始,在进行Mix GC之前,会先进行global concurrent marking(全局并发标记)
Mix GC不仅进行正常的新生代垃圾收集,同时也回收部分后台扫描线程标记的老年代分区。
由于可回收的老年代内存占整个堆内存的比例为6.48%,超过了启动Mixed GC的threshold(5%),所以开始Mixed GC。
3. 大对象
大型对象(Humongous )是大于G1中region大小50%的对象,频繁大型对象分配会导致性能问题。
可以加大region的大小,设置-XX:G1HeapRegionSize=n,但是这个参数需要设置为2的幂次方,最小值是1M,做大值是32M。如果可以的话增加JVM堆大小(即-Xmx -Xms),HR数量默认为2048。计算初始堆内存和最大堆内存的平均值average_heap_size
取HR size下限(1MB)和average_heap_size / 2048的最大值,赋值给region_size。region_size按2的幂次对齐
4. Full GC
Full GC (Allocation Failure) – 表示这是一个 Full GC 事件,触发的原因是因为空间分配失败,引起GC的原因是因为在年轻代中没有足够的空间能够存储新的数据了。用时 2.98秒
"to-space exhausted"和“Evacuation Failure”
这种情况属于转移失败,
1. 建议调小-XX:InitiatingHeapOccupancyPercent=N
这个参数的值,因为转移失败的代价比多执行一些并发标记周期高很多
-XX:InitiatingHeapOccupancyPercent=45 - 启动并发GC时的堆内存占用百分比. G1用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比例。值为 0 则表示“一直执行GC循环)'. 默认值为 45 (例如, 全部的 45% 或者使用了45%).
2. 建议通过调整-XX:ConcGCThreads
,增加用于垃圾收集的线程个数,代价是会多一些CPU的消耗;也就是会占用Java应用的CPU时间,这一点也需要权衡一下。
3. 有时候转移失败是由于survivor分区中没有足够的空间容纳新晋升的对象,如果是这种情况,还可以考虑增加-XX:G1ReservePercent
的大小,在G1中这个默认值是10%。
4. 还可以考虑增加每次混合式垃圾收集收集的Old分区数量,通过调整-XX:G1MixedGCCountTarget=N
参数可以控制每个混合式周期中回收的Old分区数量,该参数的默认值是8