JVM 调优主要就是调整下面两个指标
- 停顿时间: 垃圾收集器做垃圾回收中断应用执行的时间。-XX:MaxGCPauseMillis
- 吞吐量:花在垃圾收集的时间和花在应用时间的占比 -XX:GCTimeRatio=,垃圾收集时间占比:1/(1+n)
GC 调优步骤
- 打印GC日志 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:./gc.log
- 分析日志得到关键性指标
- 分析GC原因,调优JVM参数
Parallel Scavenge 收集器(默认)
- 分析 parallel-gc.log
- 第一次调优,设置 Metaspace 大小:增大元空间大小-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M
- 第二次调优,添加吞吐量和停顿时间参数:-XX:MaxGCPauseMillis=100 -XX:GCTimeRatio=99
- 第三次调优,修改动态扩容增量:-XX:YoungGenerationSizeIncrement=30
配置 CMS 收集器
-XX:+UseConcMarkSweepGC
分析 cms-gc.log
配置 G1 收集器
-XX:+UseG1GC
分析g1-gc.log
查看发生 MixedGC 的阈值:jinfo -flag InitiatingHeapOccupancyPercent 进程id
分析工具:gceasy,GCViewer
G1 调优相关
常用参数
- -XX:+UseG1GC 开启 G1
- -XX:G1HeapRegionSize=n,region 的大小,1-32M,2048个
- -XX:MaxGCPauseMillis=200 最大停顿时间
- -XX:G1NewSizePercent -XX:G1MaxNewSizePercent
- -XX:G1ReservePercent=10 保留防止 to space 溢出
- -XX:ParallelGCThreads=n SWT 线程数(停止应用程序)
- -XX:ConcGCThreads=n 并发线程数 = 1/4*并行
最佳实践
- 年轻代大小:避免使用-Xmn、-XX:NewRatio等显示设置Young区大小,会覆盖暂停时间目标(常用参数3)
- 暂停时间目标:暂停时间不要太严苛,其吞吐量目标是90%的应用程序时间和10%的垃圾回收时间,太严苛会直接影响到吞吐量
是否需要切换到 G1
- 50%以上的堆被存活对象占用
- 对象分配和晋升的速度变化非常大
- 垃圾回收时间特别长,超过1秒
G1 调优目标
- 6GB以上内存
- 停顿时间是500ms以内
- 吞吐量是90%以上