JVM GC调优

目标

满足应用的响应时间和吞吐量需求,尽量减少GC对应用的影响

原则

  1. 大部分时候都不需要调优GC,只需配置-Xms,-Xmx即可,JVM会自动进行调整
  2. 先满足响应时间需求,再满足吞吐量需求
  3. FullGC对应用的影响更大,要尽量减少FullGC执行的时间和频率,减少转移到Old的对象数量

监控GC状态

  • 查看一下GC的总体执行情况
jstat -gcutil pid
参数说明
YGCMinor GC执行的次数
YGCTMinor GC执行的总耗时
YGCT/YGCMinor GC平均耗时
FGCFull GC执行的次数
FGCTFull GC执行的总耗时
FGCT/FGCFull GC平均耗时
  • 查看一下GC执行的频率和详细情况
    在命令行中加入-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:filename
    查看GC日志中每次GC的间隔时间,即可得出GC执行的频率
    也可以使用GcViewer工具,导入GC日志,进行更详细的分析(趋势分析,什么时间段GC执行得更频繁,耗时更多等)

分析监控结果

分析GC结果,确定是否需要调优,可参考以下标准(实际标准以应用的实际情况为准)

  • Minor GC平均耗时少于50毫秒
  • Minor GC平均频率少于10秒
  • Full GC平均耗时少于1秒
  • Full GC平均频率少于10分钟

当出现OutOfMemoryError时,要确定是什么问题,是内存分配不足还是因为内存泄漏或者没有及时,可以通过jmap命令或者在命令行加入-XX:+HeapDumpOnOutOfMemoryError,然后对dump出的Heap进行分析(可以使用MAT或者jvisualvm工具)

调优GC

基本策略

  1. 调整Heap中各区的大小,目标是寻找一个平衡点,在不发生OutOfMemoryError的情况下,满足应用响应时间和吞吐量的需求
    增大内存,可以减少GC执行频率,但会增加GC执行时间
    减少内存,可以减少GC执行时间,但会增加GC执行频率
  2. 内存不作动态调整,因为每次调整内存(Heap或Perm)都会触发FullGC
    • -Xms和-Xmx设置成相同(整个Heap大小不变)
    • 设置-Xmn(Young区大小不变,从而Old区的大小也不变)
    • 设置-XX:SurvivorRatio(Eden、两个Survivor大小不变)
    • -XX:PermSize和-XX:MaxPermSize设置成相同(Perm区大小不变)
  3. 避免主动触发GC
    程序调用了System.gc方法,会触发FullGC
    在命令行中加入-XX:+DisableExplicitGC,可以忽略主动GC的调用

响应时间调优

  1. 使用-XX:+UseParallelOldGC策略
  2. 观察Minor GC的频率和耗时,确定Young大小
    • 确保只调整Young大小,不调整Old和Perm的大小
    • 耗时大,则减少Eden,频率高则增加Eden,此时Survivor大小不变
    • 如果耗时和频率都合适,则保持Eden大小不变,调整Survivor大小,相应要调整Young大小,主要目的是减少从Young移到Old的对象数量
    • 观察每次GC后是否有对象迁移到Old,如果有,则增加Survivor大小或对象Age大小,确保将对象尽可能地留在Young(设置-XX:+PrintTenuringDistribution,可以看到每次GC后Survivor的大小和各个Age对象的数量,如果Survivor满了,则增加Survivor大小,如果Survivor未满,但仍有对象迁移到Old(排除大对象),则设置age=max(age)+1,-XX:MaxTenuringThreshold=N[0-31])
  3. 观察Full GC的频率和耗时,确定Old大小
    • 确保只调整Old大小,不调整Young和Perm大小
    • 耗时大则减少Old,频率高则增加Old
    • 如果调整后仍然不能满足耗时需求,则考虑使用CMS策略
      此时Old要增大20%-30%,因为CMS会产生碎片,要预留更多的内存给应用,否则容易产生concurrent mode error错误,会退化成Serial回收,耗时更大。如果出现concurrent mode error,可以增大Old或者减少碎片整理的百分比(-XX:CMSInitiatingOccupancyFraction=N),增大CMS的频率,加快收集Old

吞吐量调优

在满足响应时间的前提下,增加Young和Old的大小,然后再进行响应时间的分析

推荐配置

基本配置

-Xms=-Xmx
-XX:PermSize=-XX:MaxPermSize
设置-Xmn
设置-XX:SurvivorRatio
-Xss=256k(默认是1M,一般不需要那么大,如果发生StackOverflowError,则增加此值)
-XX:-UseAdaptiveSizePolicy(不允许JVM动态调整各区的大小)
-XX:+DisableExplicitGC(关闭主动GC调用)
-XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintHeapAtGC
-Xloggc:filename

CMS配置

-XX:+UseConcMarkSweepGC
-XX:+CMSParallelRemarkEnabled
-XX:+CMSScavengeBeforeRemark
-XX:+ ScavengeBeforeFullGC
-XX+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction=X
-XX:+UseCMSInitiatingOccupancyOnly
-XX:CMSInitiatingOccupancyFraction=70
-XX:CMSInitiatingPermOccupancyFraction=80
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值