Java虚拟机性能监控与调优
1 基于JDK命令行工具的监控
1.1 JVM的参数类型
1.1.1 标准参数
在JVM的各个版本基本上保持不变,很稳定的。
-help
-server -client
-version -showversion
-cp -classpath
1.1.2 X参数
非标准化参数
-Xint: 解释执行
-Xcomp: 第一次使用就编译成本地代码
-Xmixed: 混合模式,JVM自己来决定是否编译成本地代码
1.1.3 XX参数
非标准化参数
相对不稳定
主要用于JVM调优和Debug
Boolean类型
格式:-XX:[+-]<name>表示启用或者禁用name属性
比如:-XX:+UseConcMarkSweepGC
-XX:+UseG1GC
非Boolean类型
格式:-XX:<name>=<value>表示name属性的值是value
比如:-XX:MaxGCPauseMillis=500
-XX:GCTimeRatio=19
-Xmx -Xms
-Xms等价于-XX:InitialHeapSize
-Xmx等价于-XX:MaxHeapSize
命令 | 作用 |
ps -ef|grep java | 查看java的进程相关信息,以及启动的配置信息 |
jinfo -flag MaxHeapSize pid | 查看该pid的JVM最大的堆内存大小 |
jinfo -flag ThreadStackSize pid | 查看该pid的JVM每个线程的栈大小 |
1.2 运行时JVM参数查看
-XX:+PrintFlagsInitial
初始值
-XX:+PrintFlagsFinal
最终值
= 表示默认值
:= 被用户或者JVM修改后的值
-XX:+UnlockExperimentalVMOptions 解锁实验参数
-XX:+UnlockDiagnosticVMOptions 解锁诊断参数
-XX:+PrintCommandLineFlags 打印命令行参数
jps
类似与Linux服务器上的ps功能。
相关命令:
jps -help 查看帮助
jps -l 查看正在运行的列表
jps命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html
jinfo命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jinfo.html#BCGEBFDD
jstack命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstack.html#BABGJDIF
jmap命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html#CEGCECJB
jinfo
查看正在运行的JVM里面的参数值。
相关命令:jinfo -flag MaxHeapSize pid 查看正在运行的进程为PID的JVM的最大堆内存
jinfo -flags pid 查看正在运行的进程为PID的JVM的已经被修改过的JVM的参数值
查看最大内存
查看垃圾回收器
1.3 jstat查看虚拟机统计信息
类装载
jstat命令详细参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHHGFAE
参考命令:jstat -class pid 查看类加载的信息
jstat -class pid 1000 10 每隔1000ms打印一次类加载信息,打印10次。
垃圾收集
参考命令:jstat -gc pid 查看进程号为pid的JVM的垃圾收集信息,具体响应详细参数jstat命令详细参考
jstat -gc pid 1000 10 每隔1000ms打印一次进程号为pid的JVM的垃圾收集信息,打印10次。
JIT编译
参考指令:jstat -compiler pid 查看进程号为pid的JVM的即时编译信息。
2 Jmap+MAT实战内存溢出
2.1 模拟对内存溢出的代码参考:
2.2 如何导出内存映像文件
2.2.1 内存溢出自动导出
程序启动的时候,设置以下参数
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
2.2.2 使用jmap命令手动导出
jmap -dump:format=b,file=heap.hprof pid 导出进程号为pid的JVM的dump文件
jmap -heap pid 打印进程号为pid的JVM的堆信息
jmap命令
option: -heap, -clstats, -dump:<dump-options>, -F
更多详细命令参考:jmap命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html#CEGCECJB
2.3 MAT分析内存溢出
MAT工具下载地址:http://www.eclipse.org/mat/downloads.php
将步骤2.2导出的dump文件,用MAT工具打开分析。
2.4 JAVA线程状态
NEW WAITING RUNNABLE TIMED_WAITING BLOCKED TERMINATED
更多详细信息参考:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr034.html
3 实战死循环导致CPU飙高
查找死循环导致CPU飙高问题的常用指令:
top -p pid -H #打印该进程的所有线程,查看占用CPU资源超高的线程ID,该线程ID为10进制,要用下面的命令将其转换为16进制,然后在stack信息中查找详细信息
printf "%x" 十进制的线程id #将十进制的线程id转换为16进制
jstack pid #打印程序的stack信息,从中找出CPU占用超过的线程ID的stack信息
也可以参考:https://www.cnblogs.com/alsodzy/p/10188691.html,来排查CPU飙高的问题。