天天看点

常见性能瓶颈调优总结之JVM1小时1次CMS FGC调优

在过去做性能测试过程中经常看到1小时1次fgc问题,该问题在高并发情况下对性能产生很大的波动不可小看,也许一个小小的调优可以给性能带来很大的改善。

  应用出现1小时1次fgc,所引发的原因是由于使用了rmi,会自动1小时调用1次system.gc()。

  大多数的应用虽然配置了cms gc方式,但是如果没有使用-xx:+explicitgcinvokesconcurrent,则会出现显示调用system.gc(),且不会进行 cms的fgc,带来的影响是造成tps的波动(fgc停机时间越长,则波动会越大)。

  收集各方的意见后,总结针对此类问题的解决方法如下:

  1、增加参数 -xx:+disableexplicitgc

  该方法system.gc()的调用就会变成一个空调用。但是该方法不适用在大量使用nio的direct memory,经常、反复的申请directbytebuffer的应用中使用,会造成“java.lang.outofmemoryerror: direct buffer memory ”。该方法需根据应用具体情况而定。

  2、增加参数 -dsun.rmi.dgc.client.gcinterval=3600000 -dsun.rmi.dgc.server.gcinterval=3600000

  其中3600000即为定时触发的时间间隔设置,单位是毫秒,可适当延长触发fgc的定时时间间隔。

  -dsun.rmi.dgc.client.gcinterval=long.max_value -dsun.rmi.dgc.server.gcinterval=long.max_value 则将fc时间间隔设为long型的最大值

  3、增加参数 -xx:+explicitgcinvokesconcurrent 或者-xx:+explicitgcinvokesconcurrentandunloadsclasses

  该方法可以指定system.gc()采用 cms 算法,fgc时停机时间会变短,但是cms gc次数不会变,仍然是1小时1次。

原创作品,转载时请务必以超链接形式标明本文原始出处、作者信息和本声明,否则将追究法律责任。

继续阅读