JVM性能调优【姿势大全】

当你想要进行JVM调优时,首先你要对自己的系统有清晰的认识,其次也要明确,调优并非万用的,需要视具体情况而定, 有时升级新版本的JDK带来的效果可能要比调优带来的效果更加显著;调优的过程也大致分为:确立目标,调试优化,结果验收

JVM参数简介

既然要调优,那我们需要对JVM参数有一定的认识,如下是我们常用一些参数:

常用参数

参数 示例 语义
-XX:+PrintCommandLineFlags 输出启动参数
-Xmxsize -Xmx1024m 最大堆大小
-Xmssize -Xms512m 初始堆大小
-Xmnsize -Xmn256m 新生代大小
-Xsssize -Xss1m 线程栈大小
-XX:MaxNewSize=size -XX:MaxNewSize=128m 最大新生代大小
-XX:MetaspaceSize=size 元数据区大小
-XX:MaxMetaspaceSize=size 最大元数据区大小
-XX:TLABSize=size 线程缓存区大小
-XX:NewRatio=ratio 默认2 占整个堆的1/(ratio+1)
-XX:SurvivorRatio=ratio 默认8 占整个新生代的1/(ratio+1)
-XX:MaxTenuringThreshold=Threshold 晋升到年龄大小
-XX:PretenureSizeThreshold=Threshold Serial,ParNew有效 对象直接晋升大小阈值

垃圾收集相关参数

参数 示例 语义
-verbose:gc -verbose:gc 显示每次GC的情况
-Xloggc:filename -Xloggc:gc.log 将GC日志输出到gc.log文件
-XX:+PrintGCDetails 输出GC详细信息
-XX:+TraceClassLoading -XX:+TraceClassLoading 追踪类加载信息
-XX:+TraceClassUnloading -XX:+TraceClassUnloading 追踪类卸载信息
-XX:+HeapDumpOnOutOfMemoryError 内存溢出时输出dump文件
-XX:+TLAB 默认开启 使用线程分配缓存区
-XX:+UseParallelGC 使用Parallel收集器
-XX:+UseG1GC 使用G1收集器
-XX:+UseSerialGC 使用Serial收集器
-XX:+UseParNewGC 使用ParNew收集器
-XX:+UseConcMarkSweepGC 使用CMS收集器

TIPS

  • 全量参数参考

  • JDK1.8 默认采用 Parallel Scanvage + Parrallel Old

常用工具介绍

工欲善其事必先利其器,利用JDK自带的一些工具起来,可以让我们定位问题的时候事半功倍。

jmap 常用示例

输出堆中各区使用情况

  • 示例: jmap -heap
JVM性能调优【姿势大全】_第1张图片
image.png

输出堆快照

  • 示例: jmap -dump:live,format=b,file=heap.hprof

jstat 常用示例

以一定时间比例输出GC情况

  • 示例: jstat -gcutil
JVM性能调优【姿势大全】_第2张图片
jstat

S0表示Survivor 0区占用比例
S1表示Survivor 1区占用比例
E 表示Eden区占用比例
O 表示Old区占用比例
M 表示Metaspace区占用比例
CCS 表示压缩使用比例
YGC 表示Young GC 次数
YGCT 表示Young GC 耗时
FGC 表示Full GC 次数
FGCT 表示Full GC 耗时
GCT 表示GC 总耗时

jstack 常用示例

输出线程快照

  • 示例: jstack

jvisualvm

JVM性能调优【姿势大全】_第3张图片

jconsole

JVM性能调优【姿势大全】_第4张图片

GC日志识别

前面我们介绍了一些参数,以及工具的使用,我们该如何去读GC日志呢?不同的垃圾收集器输出的日志,稍有差异,但其核心内容基本都大同小异。

GC日志

JVM性能调优【姿势大全】_第5张图片
GC日志.jpg

Full GC日志

JVM性能调优【姿势大全】_第6张图片
Full GC日志.jpg

实战参考

实战参考美团GC调优的过程

你可能感兴趣的:(JVM性能调优【姿势大全】)