虚拟机性能监控与故障处理基础工具

1、 jps:虚拟机进程状况工具

JVM Process Status Tool可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Classmain()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(LVMID, Local Virtual Machine Identifier)。

语法:

1
jps [options]

options选项:

选项 作用
-q 只输出LVMID,省略主类的名称
-m 输出虚拟机进程启动时传递给主类main()函数的参数
-l 输出主类的全名,如果进程执行的是jar包,则输出JAR路径
v 输出虚拟机经常启动时的JVM参数

2、jstat:虚拟机统计信息监视工具

JVM statistics Monitoring Tool是用于监视虚拟机各种运行状态信息的命令行工具。可以显示虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据。

语法:

1
jstat -<option> [-h<lines>] <vmid> [<interval> [<count>]]
  • interval:查询时间间隔,单位支持mss,默认为ms
  • count:查询次数
  • vmidLVMID,通过jps获取
  • lines

option选项:使用jstat -options获取完整选项列表

选项 作用
-class 监视类加载、卸载数量、总空间及类装载所耗费的时间
-compiler 输出即时编译器编译过的方法、耗时等信息
-gc 监视Java堆情况,包括Eden区、2个Survivor区、老年代、元空间等的容量,已用空间,垃圾收集时间合计等信息
-gccapacity 内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间
-gccause -gcutil功能一样,但是会额外输出导致上一次垃圾收集产生的原因
-gcmetacapacity 输出元空间使用的最最小空间
-gcnew 监视新生代垃圾收集情况
-gcnewcapacity 监视内容与-gcnew基本相同,输出主要关注使用到的最大、最小空间
-gcold 监视老生代垃圾收集情况
-gcoldcapacity 监视内容与-gcold基本相同,输出主要关注使用到的最大、最小空间
-gcutil 内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
printcompilation 输出已经被即时编译的方法

3、jinfoJava配置信息工具

Configuration Info for Java用于实时查看和调整虚拟机各项参数。

语法:

1
jinfo <option> <pid>

选项option为可选参数,无值时输出VM flags和系统属性。

option选项:

选项 作用
-flag <name> 输出VM flag
-flag [+|-]<name> 启用或禁用VM flag
-flag <name>=<value> 设置VM flag为指定值
-flags 输出当前虚拟机支持的所有flags,可以查看显示指定的flag默认值
-sysprops 输出Java系统属性,即System.getProperties()

4、jmapJava内存映射工具

Memory Map for Java用于生成堆转储快照(一般称为heapdumpdump文件),还可以查询finalize执行队列、Java堆和方法区的详细信息,如空间利用率、当前使用的是哪种收集器等。

语法:

1
jmap -<option> <pid>

option选项:

选项 作用
-clstats 输出class loader统计信息
-finalizerinfo 显示等待Finalizer执行finalize方法的对象
-histo 显示堆中对象统计信息,包括类、实例数量、合计容量
-dump 生成Java堆转储快照
-heap 显示Java堆详细信息,如使用哪种回收器、参数配置,分代情况等。从JDK 9开始选项废弃

dump-options选项:

选项 作用
live 只转储live状态的对象
all 转储所有的对象
format=b 二进制格式
file=<file> 转储对象存储文件路径

histo-options选项:

选项 作用
live 只统计live状态的对象
all 统计所有的对象
file=<file> 存储文件路径

6、jstackJava堆栈跟踪工具

Stack Trace for Java用于生成虚拟机当前时刻的线程快照(一般称为threaddumpjavacore文件)。线程快照是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的原因。

语法:

1
jstack <option> <pid>

option选项:

选项 作用
-l 额外显示关于锁的附加信息
-e 额外显示关于线程的附加信息,例如内存分配

7、jcmd:虚拟机诊断命令工具

JVM Command虚拟机诊断命令工具,集成 jmapjstackjinfo 等传统工具的核心功能,支持动态获取 JVM 状态、生成诊断文件、修改运行时参数等。

语法:

1
jcmd <pid> <command> <argument>

command诊断命令可以通过 jcmd <pid> help获取当前虚拟机支持的完整命令列表。

7.1 内存与垃圾回收(GC)

GC.class_histogram

  • 功能:生成堆内存中类的实例数量和内存占用的直方图(按内存降序排序)。
  • 参数
    • -all:包含所有对象(包括不可达对象)。
    • 默认输出存活对象
  • 示例
    1
    jcmd <PID> GC.class_histogram -all

GC.heap_dump

  • 功能:生成堆转储文件(HPROF 格式),用于分析内存泄漏。
  • 参数
    • <filename>:输出文件路径(必填)。
    • -overwrite:覆盖已有文件。
  • 示例
    1
    jcmd <PID> GC.heap_dump /tmp/heap.hprof -overwrite

GC.heap_info

  • 功能:显示堆内存各分区(Eden、Survivor、Old Gen、Metaspace)的使用情况。
  • 示例
    1
    jcmd <PID> GC.heap_info

GC.run / GC.run_finalization

  • 功能:显式触发 Full GC / 强制执行 finalize() 方法。
  • 示例
    1
    jcmd <PID> GC.run  # 强制 Full GC

GC.finalizer_info

  • 功能:显示等待执行 finalize() 方法的对象队列。
  • 示例
    1
    jcmd <PID> GC.finalizer_info

VM.metaspace

  • 功能:显示 Metaspace使用情况。

  • 参数:无。

  • 示例

    1
    jcmd <PID> VM.metaspace

7.2、编译器与 JIT 优化

Compiler.codecache

  • 功能:显示 JIT 编译代码缓存(CodeCache)的容量和使用情况。

  • 示例

    1
    jcmd <PID> Compiler.codecache

Compiler.CodeHeap_Analytics

  • 功能:分析 JIT 编译器的代码堆(CodeHeap)内存使用情况。
  • 示例
    1
    jcmd <PID> Compiler.CodeHeap_Analytics 

Compiler.codelist

  • 功能:列出所有 JIT 编译的代码块(方法)。
  • 示例
    1
    jcmd <PID> Compiler.codelist 

Compiler.queue

  • 功能:显示 JIT 编译队列中的待编译方法。
  • 示例
    1
    jcmd <PID> Compiler.queue

7.3、Java Flight Recorder (JFR)

JFR.start

  • 功能:启动 JFR 性能记录。
  • 参数
    • name=:记录名称(必填)。
    • settings=:配置文件(如 profiledefault)。
    • delay=:延迟启动时间(如 60s)。
    • duration=:记录时长(如 5m)。
    • filename=:直接保存记录文件。
  • 示例
    1
    2
    3
    jcmd <PID> JFR.start name=myrec settings=profile duration=30m

    jcmd 140112 JFR.start name=hello settings=profile delay=3s duration=10s filename=hello.txt

JFR.stop

  • 功能:停止 JFR 记录。
  • 参数
    • name=:记录名称(必填)。
    • filename=:导出记录文件路径。
  • 示例
    1
    jcmd <PID> JFR.stop name=myrec filename=rec.jfr

JFR.dump

  • 功能:导出 JFR 记录文件。
  • 参数
    • name=:记录名称(必填)。
    • filename=:导出文件路径(必填)。
  • 示例
    1
    jcmd <PID> JFR.dump name=myrec filename=rec.jfr

JFR.check

  • 功能:检查 JFR 记录状态。

  • 示例

    1
    jcmd <PID> JFR.check

JFR.configure

  • 功能:配置 JFR 参数(如阈值、事件类型)。

  • 参数

    • repositorypath=:事件存储路径。
  • 示例

    1
    jcmd <PID> JFR.configure repositorypath=/tmp/jfr

JFR.view

  • 功能:实时查看正在进行的 JFR 记录数据(需配合 JFR.start)。

  • 参数:

    • maxage:事件事件窗,单位支持smh,默认为10m
    • maxsize:事件允许的最大字节数,单位支持mMgG,默认为32MB
  • 示例

    1
    jcmd <PID> JFR.view event事件

可以使用jcmd <PID> JFR.view查看内置event事件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Java virtual machine views:
class-modifications gc-concurrent-phases longest-compilations
compiler-configuration gc-configuration native-memory-committed
compiler-phases gc-cpu-time native-memory-reserved
compiler-statistics gc-pause-phases safepoints
deoptimizations-by-reason gc-pauses tlabs
deoptimizations-by-site gc-references vm-operations
gc heap-configuration

Environment views:
active-recordings cpu-information jvm-flags
active-settings cpu-load native-libraries
container-configuration cpu-load-samples network-utilization
container-cpu-throttling cpu-tsc recording
container-cpu-usage environment-variables system-information
container-io-usage events-by-count system-processes
container-memory-usage events-by-name system-properties

Application views:
allocation-by-class exception-count native-methods
allocation-by-site file-reads-by-path object-statistics
allocation-by-thread file-writes-by-path pinned-threads
class-loaders finalizers socket-reads-by-host
contention-by-address hot-methods socket-writes-by-host
contention-by-class latencies-by-type thread-allocation
contention-by-site longest-class-loading thread-count
contention-by-thread memory-leaks-by-class thread-cpu-load
exception-by-message memory-leaks-by-site thread-start
exception-by-site modules

7.4、线程管理

Thread.print

  • 功能:生成线程转储(含锁信息),替代 jstack
  • 参数
    • -l:显示锁信息(默认包含)。
    • -e:显示线程额外信息,分配内存之类
  • 示例
    1
    jcmd <PID> Thread.print -l > thread_dump.txt

Thread.dump_to_file

  • 功能:将线程转储直接写入文件。
  • 参数
    • <filename>:输出文件路径(必填)。
    • -overwrite:覆盖已有文件。
  • 示例
    1
    jcmd <PID> Thread.dump_to_file -overwrite /tmp/thread_dump.txt

7.5、本地内存与 Native 分析

System.native_heap_info

  • 功能:显示 Native 堆内存分配情况。
  • 示例
    1
    jcmd <PID> System.native_heap_info

VM.native_memory

  • 功能:显示 Native 内存分配详情(需启用 -XX:NativeMemoryTracking=summary/detail)。

  • 参数

    • summary:摘要模式。
    • detail:详细模式。
  • 示例

    1
    jcmd <PID> VM.native_memory detail

7.6、JVM 诊断与参数管理

VM.flags

  • 功能:查看所有 JVM 启动参数(含默认值)。
  • 参数
    • -all:显示所有参数(包括默认值)。
  • 示例
    1
    jcmd <PID> VM.flags -all

VM.set_flag

  • 功能:动态修改可写的 JVM 参数(需参数标记为 manageable)。
  • 参数
    • <flag>:参数名(如 PrintGCDetails)。
    • <value>:参数值(如 true)。
  • 示例
    1
    jcmd <PID> VM.set_flag PrintGCDetails true

VM.log

  • 功能:管理 JVM 日志输出。

  • 参数

    • output=:日志文件路径。
    • what=:配置日志输出tag
    • decorators:日志输出内容装饰decorators
    • list:列出当前日志配置信息
    • rotate:滚动所有日志文件
  • 示例

    1
    jcmd <PID> VM.log output=gc.log what=gc* decorators=time,hostname

VM.command_line

  • 功能:显示 JVM 启动时的完整命令行参数。

  • 示例

    1
    jcmd <PID> VM.command_line

VM.dynlibs

  • 功能:列出所有动态加载的本地库(.so.dll 文件)。

  • 示例

    1
    jcmd <PID> VM.dynlibs

VM.events

  • 功能:显示 JVM 事件日志(如 GC、编译事件)。

  • 示例

    1
    jcmd <PID> VM.events

VM.stringtable

  • 功能:显示字符串常量池(String Table)的内容。

  • -verbose:显示详细信息(如哈希值、引用计数)。

  • 示例

    1
    jcmd <PID> VM.stringtable -verbose

VM.symboltable

  • 功能:显示符号表(Symbol Table)的内容(类名、方法名等符号)。

  • 示例

    1
    jcmd <PID> VM.symboltable

VM.systemdictionary

  • 功能:显示系统字典中的类信息(类加载器与类的映射关系)。

  • 示例

    1
    jcmd <PID> VM.systemdictionary

7.7、类与类加载器

VM.classloaders

  • 功能:显示所有类加载器及其层级关系。

  • 示例

    1
    jcmd <PID> VM.classloaders

VM.class_hierarchy

  • 功能:显示类的继承层次。
  • 参数
    • <className>:目标类名(支持通配符 *)。
    • -i:忽略大小写。
    • -s:显示子类。
  • 示例
    1
    jcmd <PID> VM.class_hierarchy java.lang.String -i

VM.classes

  • 功能:列出所有已加载的类。
  • 示例
    1
    jcmd <PID> VM.classes

VM.classloader_stats

  • 功能:统计类加载器的活动。
  • 示例
    1
    jcmd <PID> VM.classloader_stats

7.8、系统信息与工具

VM.uptime

  • 功能:显示 JVM 运行时间(毫秒)。
  • 示例
    1
    jcmd <PID> VM.uptime

VM.version

  • 功能:显示 JVM 版本信息。
  • 示例
    1
    jcmd <PID> VM.version

VM.system_properties

  • 功能:输出所有系统属性(System.getProperties())。
  • 示例
    1
    jcmd <PID> VM.system_properties

VM.info

  • 功能:显示 JVM 基本信息(版本、运行模式、PID 等)。

  • 示例

    1
    jcmd <PID> VM.info

8、jhsdb:虚拟机诊断Debugger

Java HotSpot Debugger是 JDK 提供的诊断工具,支持 实时进程调试核心转储分析。它整合了 jstackjmapjinfo 等传统命令的功能,并扩展了底层调试能力,适用于内存泄漏、死锁、JVM 崩溃等复杂问题分析

JCMDJHSDB和基础工具的对比

基础工具 JCMD 命令 JHSDB 命令
jps -lm jcmd N/A
jmap -dump <pid> jcmd <pid> GC.heap_dump jhsdb jmap --binaryheap --pid <pid>
jmap -histo <pid> jcmd <pid> GC.class_histogram jhsdb jmap --histo --pid <pid>
jstack <pid> jcmd <pid> Thread.print jhsdb jstack --locks --pid <pid>
jinfo -sysprops <pid> jcmd <pid> VM.system_properties jhsdb jinfo --sysprops --pid <pid>
jinfo -flags <pid> jcmd <pid> VM.flags jhsdb jinfo --flags --pid <pid>

虚拟机性能监控与故障处理基础工具
https://probiecoder.cn/java/jvm/base-tool.html
作者
duwei
发布于
2025年5月20日
许可协议