- -XX:+DisableExplicitGC 禁止使用System.gc(),虽说一般的程序猿也不会这么用,还是加上保险
- 千万不要设置年轻代大小,G1会动态调节。
- -verbose:gc -Xloggc:target/gc.log 一定要设置好gc日志,方便定位
- -XX:MaxGCPauseMillis 默认是250ms。如果希望cpu多用于业务计算少用于gc线程,可以调大这个值。
- 如果G1发生full gc较多,需要分析原因。如果日志中这一行 "Humongous regions: X->Y” 中的Y就是大对象占用的region数量。可以使用 -XX:G1HeapRegionSize 调大region的大小来减少大对象占用的region数。
- 增加并发标记的线程数,通过 -XX:ConcGCThreads这个参数。可以让垃圾回收更快一点,以减少有些垃圾来不及回收。但是会影响cpu的使用
-XX:G1ReservePercent G1会保留一部分堆内存用来防止分配不了的情况,默认是10
- -XX:InitiatingHeapOccupancyPercent 全部使用的region占到总堆空间多少开始gc,默认值45%。调小可以早点开始gc周期
-XX:G1MixedGCLiveThresholdPercent=65
为混合垃圾回收周期中要包括的旧区域设置占用率阈值。默认占用率为 65%。这是一个实验性的标志。有关示例,请参见“如何解锁实验性虚拟机标志”。此设置取代了 -XX:G1OldCSetRegionLiveThresholdPercent 设置。Java HotSpot VM build 23 中没有此设置。
-XX:G1MixedGCCountTarget=8 调大该值可以减少每次停顿的时间
设置标记周期完成后,对存活数据上限为 G1MixedGCLIveThresholdPercent 的旧区域执行混合垃圾回收的目标次数。默认值是 8 次混合垃圾回收。混合回收的目标是要控制在此目标次数以内。Java HotSpot VM build 23 中没有此设置。
- -XX:+G1EagerReclaimHumongousObjects 在YGC的时候,G1也能回收那些没有任何引用指向的超大对象
参考的文章
https://www.oracle.com/cn/technical-resources/articles/java/g1gc.html
转载自 https://blog.csdn.net/renfufei/article/details/41897113
什么是转移失败(Evacuation Failure)?
对 survivors 或 promoted objects 进行GC时如果JVM的heap区不足就会发生提升失败(promotion failure). 堆内存不能继续扩充,因为已经达到最大值了. 当使用 -XX:+PrintGCDetails
时将会在GC日志中显示 to-space overflow (to-空间溢出)。
这是很昂贵的操作!
- GC仍继续所以空间必须被释放.
- 拷贝失败的对象必须被放到正确的位置(tenured in place).
- CSet指向区域中的任何 RSets 更新都必须重新生成(regenerated).
- 所有这些步骤都是代价高昂的.
如何避免转移失败(Evacuation Failure)
要避免避免转移失败, 考虑采纳下列选项.
- 增加堆内存大小
- 增加 -XX:G1ReservePercent=n, 其默认值是 10.
- G1创建了一个假天花板(false ceiling),在需要更大 'to-space' 的情况下会尝试从保留内存获取(leave the reserve memory free).
- 更早启动标记周期(marking cycle)
- 通过采用 -XX:ConcGCThreads=n 选项增加标记线程(marking threads)的数量.
选项/默认值 | 说明 |
---|---|
-XX:+UseG1GC | 使用 G1 (Garbage First) 垃圾收集器 |
-XX:MaxGCPauseMillis=n | 设置最大GC停顿时间(GC pause time)指标(target). 这是一个软性指标(soft goal), JVM 会尽量去达成这个目标. |
-XX:InitiatingHeapOccupancyPercent=n | 启动并发GC周期时的堆内存占用百分比. G1之类的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比. 值为 0 则表示"一直执行GC循环". 默认值为 45. |
-XX:NewRatio=n | 新生代与老生代(new/old generation)的大小比例(Ratio). 默认值为 2. |
-XX:SurvivorRatio=n | eden/survivor 空间大小的比例(Ratio). 默认值为 8. |
-XX:MaxTenuringThreshold=n | 提升年老代的最大临界值(tenuring threshold). 默认值为 15. |
-XX:ParallelGCThreads=n | 设置垃圾收集器在并行阶段使用的线程数,默认值随JVM运行的平台不同而不同. |
-XX:ConcGCThreads=n | 并发垃圾收集器使用的线程数量. 默认值随JVM运行的平台不同而不同. |
-XX:G1ReservePercent=n | 设置堆内存保留为假天花板的总量,以降低提升失败的可能性. 默认值是 10. |
-XX:G1HeapRegionSize=n | 使用G1时Java堆会被分为大小统一的的区(region)。此参数可以指定每个heap区的大小. 默认值将根据 heap size 算出最优解. 最小值为 1Mb, 最大值为 32Mb. |