logo头像
Snippet 博客主题

G1垃圾收集器配置

本文于 1297 天之前发表,文中内容可能已经过时。

常用的配置整理

可选项及默认值 描述
-XX:+UseG1GC G1收集器启动
-XX:MaxGCPauseMillis=n 垃圾收集的预期时间,尽量让实际收集时间和预期时间接近
-XX:InitiatingHeapOccupancyPercent=n 设置触发标记周期的 Java 堆占用率阈值。默认占用率是整个 Java 堆的 45%。默认值 45.tip:避免使用 -Xmn 选项或 -XX:NewRatio 等其他相关选项显式设置年轻代大小。固定年轻代的大小会覆盖暂停时间目标。
-XX:NewRatio=n new/old 年代的大小比例. 默认值 2.G1 一般不设置这个值,而是通过设置
-XX:ConcGCThreads=n 设置并行标记的线程数。将 n 设置为并行垃圾回收线程数 (ParallelGCThreads) 的 1/4 左右
-XX:ParallelGCThreads=n 垃圾收集的线程数,一般逻辑处理器的数量
-XX:SurvivorRatio=n eden/survivor 空间的大小比例. 默认值 8.
-XX:G1HeapRegionSize=n 使用G1,Java堆被划分为大小均匀的区域。这个参数配置各个子区域的大小。此参数的默认值根据堆大小的人工进行确定。最小值为 1Mb 且最大值为 32Mb,一般是2048个region,2G的内存空间设置为1M。
-XX:SurvivorRatio=n eden/survivor 空间的大小比例. 默认值 8.
-XX:+DisableExplicitGC 禁止在程序中System.gc
-XX:+UseTLAB 优先尝试在TALB空间分配内存。如果是新生代分配,会同步锁定,tlab无所分配,所以效率相对稳定。

日记配置整理

-verbose:gc
-XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintGCDateStamps
-XX:+PrintAdaptiveSizePolicy
-Xloggc:/appl/gclogs/gc.log

试验性虚拟机标志

可选项及默认值 描述
XX:+UnlockExperimentalVMOptions 解锁试验性虚拟起标志
-XX:G1MixedGCLiveThresholdPercent
-XX:G1HeapWastePercent
-XX:G1MixedGCCountTarge
-XX:G1OldCSetRegionThresholdPercent 设置老年代可回收的阀值

关于堆内存满的问题

可以优化的点

1: 目标时间,设置短一点,减少吞吐量,但增加稳定行
2:增加并行标记时间-XX:ConcGCThreads=n,但一般为可能太大。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
触发Full GC

在某些情况下,G1触发了Full GC,这时G1会退化使用Serial收集器来完成垃圾的清理工作,它仅仅使用单线程来完成GC工作,GC暂停时间将达到秒级别的。整个应用处于假死状态,不能处理任何请求,我们的程序当然不希望看到这些。那么发生Full GC的情况有哪些呢?

并发模式失败
G1启动标记周期,但在Mix GC之前,老年代就被填满,这时候G1会放弃标记周期。这种情形下,需要增加堆大小,或者调整周期(例如增加线程数-XX:ConcGCThreads等)。

晋升失败或者疏散失败
G1在进行GC的时候没有足够的内存供存活对象或晋升对象使用,由此触发了Full GC。可以在日志中看到(to-space exhausted)或者(to-space overflow)。解决这种问题的方式是:

a,增加 -XX:G1ReservePercent 选项的值(并相应增加总的堆大小),为“目标空间”增加预留内存量。

b,通过减少 -XX:InitiatingHeapOccupancyPercent 提前启动标记周期。

c,也可以通过增加 -XX:ConcGCThreads 选项的值来增加并行标记线程的数目。

巨型对象分配失败
当巨型对象找不到合适的空间进行分配时,就会启动Full GC,来释放空间。这种情况下,应该避免分配大量的巨型对象,增加内存或者增大-XX:G1HeapRegionSize,使巨型对象不再是巨型对象。

由于篇幅有限,G1还有很多调优实践,在此就不一一列出了,大家在平常的实践中可以慢慢探索。最后,期待java 9能正式发布,默认使用G1为垃圾收集器的java性能会不会又提高呢?

参考资料:

1
https://blog.csdn.net/u013380694/article/details/83341913