【jvm第7集】jvm调优工具(命令行工具)
文章目录
- JVM 调优工具(命令行工具)
- jps(Java Virtual Machine Process Status Tool)
- jstat(JVM Statistics Monitoring Tool)
- jmap(Memory Map Tool)
- jstack(Thread Stack Tool)
- jinfo(Java Configuration Info Tool)
- jvisualvm(VisualVM)
- 工具组合使用示例
- 场景 1:定位内存泄漏
- 场景 2:分析 CPU 高占用
- 场景 3:优化 GC 配置
- 注意事项
JVM 调优工具(命令行工具)
jps(Java Virtual Machine Process Status Tool)
- 输入参数
参数 | 说明 |
---|---|
-l | 显示主类的完整路径或 JAR 文件名。 |
-q | 仅显示进程 ID(不显示主类名)。 |
-m | 显示传递给 main 方法的参数。 |
-v | 显示 JVM 启动参数(如 -Xmx 、-Xms )。 |
-V | 显示通过 .hotspotrc 文件传递的 JVM 参数。 |
- 输出示例
# jps -l 输出示例
12345 /path/to/MyApplication.jar
67890 com.example.MyMainClass
- 输出字段解释
- 进程 ID:Java 进程的唯一标识符。
- 主类名或 JAR 文件名:启动 Java 程序的主类或 JAR 包路径。
- JVM 参数(当使用
-v
时):显示-Xmx
、-Xms
等配置参数。
jstat(JVM Statistics Monitoring Tool)
- 输入参数
参数 | 说明 |
---|---|
-class | 类加载/卸载统计(类数、占用空间、耗时)。 |
-gc | 显示 GC 堆行为(Eden、Survivor、Old Gen 的容量和使用量)。 |
-gcutil | 显示 GC 摘要信息(各区域使用百分比)。 |
-gccapacity | 显示各区域容量阈值(最小/最大容量)。 |
-gcnew | 显示新生代 GC 情况。 |
-gcold | 显示老年代 GC 情况。 |
-gccause | 显示最近一次 GC 的原因。 |
- 输出示例
# jstat -gc <pid> 输出示例S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
1024.0 1024.0 0.0 0.0 8192.0 2048.0 16384.0 4096.0 6144.0 1536.0 512.0 128.0 4 0.020 1 0.010 0.030
- 输出字段解释
字段 | 含义 |
---|---|
S0C/S1C | Survivor 区总容量(KB) |
S0U/S1U | Survivor 区已使用容量(KB) |
EC/EU | Eden 区总容量/已使用容量(KB) |
OC/OU | 老年代总容量/已使用容量(KB) |
MC/MU | 元空间总容量/已使用容量(KB) |
CCSC/CCSU | 压缩类空间总容量/已使用容量(KB) |
YGC/YGCT | 年轻代 GC 次数/总耗时(秒) |
FGC/FGCT | Full GC 次数/总耗时(秒) |
GCT | 所有 GC 总耗时(秒) |
jmap(Memory Map Tool)
- 输入参数
参数 | 说明 |
---|---|
-heap | 显示堆内存详细配置(堆大小、GC 器类型)。 |
-histo | 显示堆中对象的直方图(对象数量、占用内存)。 |
-histo:live | 显示存活对象的直方图(触发 Full GC)。 |
-dump:format=b,file=<file> | 生成堆转储文件(二进制格式)。 |
-finalizerinfo | 显示等待终结的对象信息。 |
-clstats | 显示类加载器统计信息。 |
- 输出示例
# jmap -histo <pid> 输出示例num #instances #bytes class name
---------------------------------------------1: 1000000 80000000 [C2: 500000 40000000 java.lang.String3: 200000 20000000 [B
- 输出字段解释
字段 | 含义 |
---|---|
num | 排名(按占用内存降序) |
#instances | 对象实例数 |
#bytes | 对象占用内存(字节) |
class name | 类名(如 [C 表示 char[] ) |
jstack(Thread Stack Tool)
- 输入参数
参数 | 说明 |
---|---|
-l | 显示锁信息(如持有的锁、等待的锁)。 |
-m | 显示混合模式堆栈(Java + Native 堆栈)。 |
-F | 强制生成线程转储(适用于无响应的进程)。 |
- 输出示例
# jstack <pid> 输出示例
"main" #1 prio=5 os_prio=31 tid=0x00007f8e3c000000 nid=0x12345 runnable [0x0000700000000000]java.lang.Thread.State: RUNNABLEat java.net.SocketInputStream.socketRead0(Native Method)at java.net.SocketInputStream.read(SocketInputStream.java:152)at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284)at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326)...
- 输出字段解释
字段 | 含义 |
---|---|
线程名 | 线程名称(如 main )。 |
状态 | 线程状态(如 RUNNABLE 、BLOCKED )。 |
堆栈跟踪 | 方法调用链,用于定位代码位置。 |
锁信息 (-l 参数) | 显示线程持有的锁或等待的锁。 |
jinfo(Java Configuration Info Tool)
- 输入参数
参数 | 说明 |
---|---|
-flags | 显示所有 JVM 参数。 |
-flag <name> | 查看指定 JVM 参数的值。 |
-flag [+/-]<name> | 开启或关闭 JVM 参数。 |
-flag <name>=<value> | 设置 JVM 参数的值。 |
-sysprops | 显示系统属性(如 java.version )。 |
- 输出示例
# jinfo -flags <pid> 输出示例
VM Flags:
-XX:CICompilerCount=4
-XX:InitialHeapSize=536870912
-XX:MaxHeapSize=1073741824
-XX:+PrintCommandLineFlags
...
- 输出字段解释
- JVM 参数:显示
-XX
参数的当前值(如MaxHeapSize
)。 - 系统属性(
-sysprops
):显示java.version
、os.name
等属性。
- JVM 参数:显示
jvisualvm(VisualVM)
-
输入参数
- 图形化界面操作:无需命令行参数,通过界面选择目标进程或远程主机。
- 远程连接配置:需在目标 JVM 启动时添加 JMX 参数(如
-Dcom.sun.management.jmxremote.port=8989
)。
-
输出内容
-
内存监控
- 堆内存使用曲线(Eden、Survivor、Old Gen)。
- 元空间(Metaspace)使用情况。
-
线程分析
- 线程状态(RUNNABLE、BLOCKED 等)。
- 线程堆栈跟踪(
jstack
输出的图形化展示)。 - 死锁检测(自动标记死锁线程)。
-
GC 分析
- GC 事件时间线(Minor GC、Full GC)。
- GC 耗时统计(YGCT、FGCT)。
-
堆转储分析
- 导入
.hprof
文件,显示对象分布。 - Dominator Tree:定位内存泄漏对象。
- 导入
-
性能调优
- CPU 使用率监控。
- 方法热点分析(采样或 Profiling)。
工具组合使用示例
场景 1:定位内存泄漏
- 输入:
jps -v
获取进程 ID。 - 输入:
jmap -dump:live,format=b,file=heapdump.hprof <pid>
生成堆转储。 - 输入:
jvisualvm
打开heapdump.hprof
。 - 输出:通过 Dominator Tree 定位占用内存最高的对象。
场景 2:分析 CPU 高占用
- 输入:
top -H -p <pid>
查找高占用线程。 - 输入:
printf "%x\n" <tid>
转换线程 ID 为十六进制。 - 输入:
jstack <pid> | grep -A 20 <hex_tid>
定位线程堆栈。 - 输出:线程堆栈跟踪显示异常代码位置(如死循环)。
场景 3:优化 GC 配置
- 输入:
jstat -gc <pid> 1000 10
监控 GC 情况。 - 输入:
jinfo -flag +UseG1GC <pid>
启用 G1 GC。 - 输出:GC 频率和耗时下降,堆内存使用更均衡。
注意事项
-
生产环境使用限制
- jmap -dump:生成堆转储可能导致 STW(Stop-The-World),建议通过
-XX:+HeapDumpOnOutOfMemoryError
自动触发。 - jstack:频繁调用可能导致性能抖动,建议仅在问题排查时使用。
- jmap -dump:生成堆转储可能导致 STW(Stop-The-World),建议通过
-
工具兼容性
- jvisualvm:仅支持 HotSpot JVM。
- jmap/jstack:需与目标 JVM 版本一致。
-
日志分析工具
- GC Viewer:分析
jstat -gcutil
生成的日志。 - MAT(Memory Analyzer):深度分析
.hprof
文件。
- GC Viewer:分析