虚拟机性能监控与故障处理基础工具
1、 jps
:虚拟机进程状况工具
JVM Process Status Tool
可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class
,main()
函数所在的类)名称以及这些进程的本地虚拟机唯一ID(LVMID, Local Virtual Machine Identifier
)。
语法:
1 |
|
options
选项:
选项 | 作用 |
---|---|
-q |
只输出LVMID ,省略主类的名称 |
-m |
输出虚拟机进程启动时传递给主类main() 函数的参数 |
-l |
输出主类的全名,如果进程执行的是jar 包,则输出JAR 路径 |
v |
输出虚拟机经常启动时的JVM 参数 |
2、jstat
:虚拟机统计信息监视工具
JVM statistics Monitoring Tool
是用于监视虚拟机各种运行状态信息的命令行工具。可以显示虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据。
语法:
1 |
|
interval
:查询时间间隔,单位支持ms
和s
,默认为ms
count
:查询次数vmid
:LVMID
,通过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、jinfo
:Java
配置信息工具
Configuration Info for Java
用于实时查看和调整虚拟机各项参数。
语法:
1 |
|
选项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、jmap
:Java
内存映射工具
Memory Map for Java
用于生成堆转储快照(一般称为heapdump
或dump
文件),还可以查询finalize
执行队列、Java
堆和方法区的详细信息,如空间利用率、当前使用的是哪种收集器等。
语法:
1 |
|
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、jstack
:Java
堆栈跟踪工具
Stack Trace for Java
用于生成虚拟机当前时刻的线程快照(一般称为threaddump
或javacore
文件)。线程快照是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的原因。
语法:
1 |
|
option
选项:
选项 | 作用 |
---|---|
-l |
额外显示关于锁的附加信息 |
-e |
额外显示关于线程的附加信息,例如内存分配 |
7、jcmd
:虚拟机诊断命令工具
JVM Command
虚拟机诊断命令工具,集成 jmap
、jstack
、jinfo
等传统工具的核心功能,支持动态获取 JVM 状态、生成诊断文件、修改运行时参数等。
语法:
1 |
|
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=
:配置文件(如profile
、default
)。delay=
:延迟启动时间(如60s
)。duration=
:记录时长(如5m
)。filename=
:直接保存记录文件。
- 示例:
1
2
3jcmd <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
:事件事件窗,单位支持s
、m
、h
,默认为10m
maxsize
:事件允许的最大字节数,单位支持m
、M
、g
、G
,默认为32MB
示例:
1
jcmd <PID> JFR.view event事件
可以使用jcmd <PID> JFR.view
查看内置event
事件:
1 |
|
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 提供的诊断工具,支持 实时进程调试 和 核心转储分析。它整合了 jstack
、jmap
、jinfo
等传统命令的功能,并扩展了底层调试能力,适用于内存泄漏、死锁、JVM 崩溃等复杂问题分析
JCMD
、JHSDB
和基础工具的对比
基础工具 | 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> |