jcmd常见命令的输出信息详细解析
以下是 jcmd 常见命令的输出信息详细解析,帮助你理解各个字段及数据的含义:
1. 列出 Java 进程(jcmd -l)
示例输出:
1234 com.example.MyApplication
5678 jdk.jcmd/sun.tools.jcmd.JCmd
字段解析:
- 第一列(如
1234):Java 进程的 PID (进程 ID)。 - 第二列(如
com.example.MyApplication):主类名或 JAR 文件名;若为 JVM 内建进程(如jcmd自身),会显示工具类路径。
2. 线程转储(jcmd <pid> Thread.print)
示例输出:
2024-02-15 10:00:00
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.341-b10 mixed mode):
"main" #1 prio=5 os_prio=0 tid=0x00007f... nid=0x2a3 waiting on condition [0x00007f...]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.example.MyApplication.run(MyApplication.java:10)
...
"GC Thread#0" os_prio=0 tid=0x00007f... nid=0x2b4 runnable
...
关键字段:
- 线程名(如
"main"):线程名称,用户自定义或系统默认。 - 线程优先级:
prio(Java 优先级)和os_prio(操作系统优先级)。 - 线程 ID:
tid(Java 线程 ID)、nid(操作系统线程 ID,16进制)。 - 线程状态:
java.lang.Thread.State如RUNNABLE、BLOCKED、WAITING等。 - 调用栈:显示当前线程执行的方法链,用于定位死锁或性能瓶颈。
3. 生成堆转储(jcmd <pid> GC.heap_dump)
说明:
生成的 .hprof 文件是二进制堆转储文件,需用工具(如 MAT, VisualVM, JProfiler)解析。
MAT 解析后的关键信息:
- Dominator Tree:展示占用内存最多的对象。
- Leak Suspects:自动分析潜在内存泄漏。
- Class Histogram:类似
GC.class_histogram命令的详细视图。
4. 查看堆内存统计(jcmd <pid> GC.heap_info)
示例输出:
garbage-first heap total 1024000K, used 512000K [0x00000000ffa00000, 0x0000000100000000)
region size 1024K, 500 young (512000K), 0 survivors (0K)
Metaspace used 25600K, capacity 26000K, committed 26200K, reserved 30000K
字段解析:
- 堆总大小(
total):JVM 堆的总内存(如1024000K)。 - 已使用内存(
used):当前堆使用量。 - Region 分布:G1 等分代收集器的区域划分信息。
- Metaspace:元空间(类元数据)使用情况。
5. 查看类直方图(jcmd <pid> GC.class_histogram)
示例输出:
num #instances #bytes class name
----------------------------------------------
1: 120000 1200000000 [B (byte数组)
2: 50000 20000000 java.lang.String
3: 3000 720000 java.lang.Class
字段解析:
#instances:该类的存活实例数量。#bytes:该类所有实例占用的内存总量。class name:类名,如[B表示byte[],[I表示int[]。
6. 查看 Native 内存(jcmd <pid> VM.native_memory summary)
需启动参数 -XX:NativeMemoryTracking=summary。
示例输出:
Native Memory Tracking:
Total: reserved=2457600KB, committed=512000KB
- Heap (reserved=2048000KB, committed=409600KB)
...
- Class (reserved=102400KB, committed=25600KB)
...
- Thread (reserved=10240KB, committed=10240KB)
thread#15 stack: reserved=1024KB, committed=1024KB)
关键字段:
reserved:JVM 预留的虚拟内存(可能未完全使用)。committed:实际向操作系统申请的内存量。- 类别细分:
Heap(堆)、Class(类元数据)、Thread(线程栈)等。
7. 查看 JVM 参数(jcmd <pid> VM.flags)
示例输出:
-XX:CICompilerCount=4
-XX:InitialHeapSize=268435456
-XX:+UseG1GC
字段说明:
+/-:表示布尔类型参数启用或禁用(如+UseG1GC启用了 G1 垃圾收集器)。- 数值参数:如
InitialHeapSize=268435456(单位:字节)。
8. 生成 JFR 记录(jcmd <pid> JFR.start/JFR.dump)
JFR(Java Flight Recorder)记录文件(.jfr)需用 JDK Mission Control 或命令行工具 jfr 解析。报告中包含:
- CPU 热点方法:
jdk.ExecutionSample事件统计。 - GC 暂停时间:
jdk.GCPhasePause事件标记 Full GC 耗时。 - 内存分配:
jdk.ObjectAllocationInNewTLAB跟踪对象分配。
9. 查看系统属性(jcmd <pid> VM.system_properties)
示例输出:
java.vm.name=Java HotSpot(TM) 64-Bit Server VM
user.country=CN
file.encoding=UTF-8
常用属性:
java.version:Java 版本。os.name:操作系统名称。user.dir:进程启动目录。
通用注意事项:
- 时间单位:如堆转储中的内存单位为 KB,时间单位为 毫秒。
- 版本差异:不同 JDK 版本输出格式可能略有不同(如 G1 的堆详情)。
- 安全性:部分命令(如
JFR.start)需要 JVM 启动参数授权。
通过理解这些输出字段,可以快速定位:
- 内存泄漏(通过
GC.class_histogram对比多次快照)。 - 死锁(通过
Thread.print查找BLOCKED线程)。 - 资源瓶颈(通过
native_memory和heap_info分析内存分布)。
浙公网安备 33010602011771号