重要的JVM参数,通用及G1

  1. -XX:+DisableExplicitGC 禁止使用System.gc(),虽说一般的程序猿也不会这么用,还是加上保险
  2. 千万不要设置年轻代大小,G1会动态调节。
  3. -verbose:gc -Xloggc:target/gc.log 一定要设置好gc日志,方便定位
  4. -XX:MaxGCPauseMillis 默认是250ms。如果希望cpu多用于业务计算少用于gc线程,可以调大这个值。
  5. 如果G1发生full gc较多,需要分析原因。如果日志中这一行 "Humongous regions: X->Y” 中的Y就是大对象占用的region数量。可以使用 -XX:G1HeapRegionSize 调大region的大小来减少大对象占用的region数。
  6. 增加并发标记的线程数,通过 -XX:ConcGCThreads这个参数。可以让垃圾回收更快一点,以减少有些垃圾来不及回收。但是会影响cpu的使用
  7. -XX:G1ReservePercent G1会保留一部分堆内存用来防止分配不了的情况,默认是10
  8.  -XX:InitiatingHeapOccupancyPercent  全部使用的region占到总堆空间多少开始gc,默认值45%。调小可以早点开始gc周期
  9. -XX:G1MixedGCLiveThresholdPercent=65

    为混合垃圾回收周期中要包括的旧区域设置占用率阈值。默认占用率为 65%。这是一个实验性的标志。有关示例,请参见“如何解锁实验性虚拟机标志”。此设置取代了 -XX:G1OldCSetRegionLiveThresholdPercent 设置。Java HotSpot VM build 23 中没有此设置。

  10. -XX:G1MixedGCCountTarget=8 调大该值可以减少每次停顿的时间

    设置标记周期完成后,对存活数据上限为 G1MixedGCLIveThresholdPercent 的旧区域执行混合垃圾回收的目标次数。默认值是 8 次混合垃圾回收。混合回收的目标是要控制在此目标次数以内。Java HotSpot VM build 23 中没有此设置。

  11. -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.

posted on 2020-08-19 10:14  MaXianZhe  阅读(2676)  评论(0编辑  收藏  举报

导航