调优步骤
打印GC日志
根据日志得到关键性能指标
分析GC原因,调优JVM参数
初始设置
-XX:+HeapDumpOnOutOfMemoryError //内存溢出时,生产hprof文件
-XX:HeapDumpPath=./ //hprof文件的保存位置,./是指当前路径
-XX:+PrintGCDetails //打印GC详细信息
-XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps //打印CG发生的时间戳
-Xloggc:../logs/gc.log //日志文件的输出路径
-XX:+DisableExplicitGC //不允许使用system.gc 回收垃圾
Parallel GC
指导原则
除非确定,否则不要设置最大堆内存
优先设置吞吐量目标
如果吞吐量目标达不到,调大最大内存,不能让OS使用Swap,如果仍然达不到,降低目标
吞吐量能达到,GC时间太长,设置停顿时间的目标
指导文档
GC调优指南:
https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/toc.html
调优过程
| 吞吐量 | 最小停顿时间 | 最大停顿时间 | 平均停顿时间 | YGC | FullGC |
调优前 | 96.78% | 0.02017 | 0.10323 | 0.0487 | 11 | 2 |
一次调优后 | 98.13% | 0.01901 | 0.05685 | 0.03576 | 10 | 0 |
二次调优后 | 97.71% | 0.01519 | 0.06736 | 0.03442 | 12 | 0 |
三次调优后 | 98.14% | 0.01966 | 0.06622 | 0.04111 | 10 | 0 |
第一次调优
YoungGC发生11次垃圾回收,其中有2次metaspace引起
FullGC次,其中2次metaspace引起
工具中观察,metaspace的内存空间34M
增加相关参数:
-XX:MetaspaceSize=64M
第二次调优
##设置吞吐量目标
-XX:GCTimeRatio=99 //设置吞吐量为99%
##设置响应时间目标
-XX:MaxGCPauseMillis=100 //设置最大的停顿时间是100毫秒
第三次调优
##每次发生young gc时,内存要动态调大,默认是20%,调整为30%,可以减少younggc的次数
-XX:YoungGenerationSizeIncrement=30
G1 GC
指导原则
年轻代的大小:避免使用-Xmn、-XX:NewRatio等显示设置Young区大小,会覆盖暂停时间目标
暂停时间目标:暂停时间不要太严苛,其吞吐量目标是90%的应用程序时间和10%的垃圾回收时间,太苛刻会影响吞吐量
关于MixGC调优
-XX:InitiatingHeapOccupancyPercent
【堆占有率达到这个数值则触发global concurrent marking,默认是45%】
-XX:G1HeapWastePercent
【在global concurrent marking结束之后,可以知道区有多少空间要被回收,在每次YGC之后和再次发生MixedGC之前,会检查垃圾占比是否达到此参数,只有达到了,下次才会发生Mixed GC】
-XX:G1MixedGCLiveThresholdPercent
【Old区的region被回收的时候的存活对象占比】
-XX:G1MixedGCCountTarget
【一次global concurrent marking之后,最多执行Mixed GC的次数】
-XX:G1OldCsetRegionThresholdPercent
【一次Mixed GC中能选入CSet的最多old去区的region数量】
G1调优相关参数
-XX:+UseG1GC
-Xms 128M
-Xmx 128M
-XX:MetaspaceSize=64M
-XX:MaxGCPauseMillis=100
调优过程
| 吞吐量 | 最小停顿时间 | 最大停顿时间 | 平均停顿时间 | YGC | FullGC |
调优前 | 93.96% | 0.00001 | 0.33139 | 0.02246 | 188 | 3 |
一次调优后 | 95.4% | 0.01901 | 0.22914 | 0.0217 | 168 | 0 |
二次调优后 | 97.26% | 0.00041 | 0.04276 | 0.031131 | 339 | 0 |
第一次调优
发现metaspace导致发生full gc
添加相关参数:
-XX:MetaspaceSize=64M
效果
第二次调优
虽然fullgc不错在了,但younggc发生了138次,将堆大小改为固定值
添加相关参数:
-Xms 128M -Xmx 128M