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(操作系统优先级)。
  • 线程 IDtid(Java 线程 ID)、nid(操作系统线程 ID,16进制)。
  • 线程状态java.lang.Thread.StateRUNNABLEBLOCKEDWAITING 等。
  • 调用栈:显示当前线程执行的方法链,用于定位死锁或性能瓶颈。

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:进程启动目录。

通用注意事项

  1. 时间单位:如堆转储中的内存单位为 KB,时间单位为 毫秒
  2. 版本差异:不同 JDK 版本输出格式可能略有不同(如 G1 的堆详情)。
  3. 安全性:部分命令(如 JFR.start)需要 JVM 启动参数授权。

通过理解这些输出字段,可以快速定位:

  • 内存泄漏(通过 GC.class_histogram 对比多次快照)。
  • 死锁(通过 Thread.print 查找 BLOCKED 线程)。
  • 资源瓶颈(通过 native_memoryheap_info 分析内存分布)。
posted @ 2025-05-29 09:14  玛卡巴卡糖  阅读(426)  评论(0)    收藏  举报