在Java应用开发和运维过程中,性能监控和故障诊断是至关重要的环节。JDK自带了一系列强大的命令行工具,可以帮助开发者分析Java应用的运行状态、内存使用情况、线程状态等信息。本文将详细介绍jps、jstack、jmap、jhat、jstat和hprof这些工具的使用方法和实际应用场景。
jps(Java Virtual Machine Process Status Tool)是JDK提供的一个简单工具,用于列出当前系统中所有的Java进程及其主类名和JVM参数。
bash# 列出所有Java进程(显示主类名)
jps
# 列出所有Java进程(显示完整主类名和JVM参数)
jps -l
# 列出所有Java进程(显示传递给main方法的参数)
jps -m
# 列出所有Java进程(显示传递给JVM的参数)
jps -v
# 组合使用多个选项
jps -lmv
12345 MyApplication 23456 com.example.MainClass -Xms512m -Xmx1024m 34567 org.apache.catalina.startup.Bootstrap start
jstack用于生成Java虚拟机当前时刻的线程快照(thread dump),可以帮助分析线程状态、检测死锁等问题。
bash# 基本用法
jstack <pid>
# 输出混合模式(Java和本地方法)堆栈信息
jstack -m <pid>
# 强制生成堆栈信息(当进程挂起时)
jstack -F <pid>
# 将输出保存到文件
jstack <pid> > thread_dump.txt
jstack输出包含以下关键信息:
javaFound one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x00007f7a4800f8e8 (object 0x000000076abcb3e0, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x00007f7a4800e8e8 (object 0x000000076abcb3f0, a java.lang.Object),
which is held by "Thread-1"
jmap(Java Memory Map)用于生成Java堆的详细信息,包括内存使用情况、对象统计等。
bash# 显示堆内存概要信息
jmap -heap <pid>
# 生成堆转储文件(Heap Dump)
jmap -dump:format=b,file=heap.hprof <pid>
# 只转储存活对象
jmap -dump:live,format=b,file=heap.hprof <pid>
# 显示类的实例数量及占用内存
jmap -histo <pid>
# 显示类的实例数量及占用内存(只统计存活对象)
jmap -histo:live <pid>
jmap -heap
输出示例:
Attaching to process ID 12345, please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.131-b11 using thread-local object allocation. Parallel GC with 4 thread(s) Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 2147483648 (2048.0MB) NewSize = 44564480 (42.5MB) MaxNewSize = 715653120 (682.5MB) OldSize = 89653248 (85.5MB) NewRatio = 2 SurvivorRatio = 8 MetaspaceSize = 21807104 (20.796875MB) CompressedClassSpaceSize = 1073741824 (1024.0MB) MaxMetaspaceSize = 17592186044415 MB G1HeapRegionSize = 0 (0.0MB) Heap Usage: PS Young Generation Eden Space: capacity = 34078720 (32.5MB) used = 10248704 (9.7734375MB) free = 23830016 (22.7265625MB) 30.072115384615383% used From Space: capacity = 5242880 (5.0MB) used = 0 (0.0MB) free = 5242880 (5.0MB) 0.0% used To Space: capacity = 5242880 (5.0MB) used = 0 (0.0MB) free = 5242880 (5.0MB) 0.0% used PS Old Generation capacity = 89653248 (85.5MB) used = 0 (0.0MB) free = 89653248 (85.5MB) 0.0% used 318 interned Strings occupying 25896 bytes.
jhat(Java Heap Analysis Tool)用于分析jmap生成的堆转储文件,提供一个web界面来浏览堆内存中的对象信息。
bash# 基本用法
jhat heap.hprof
# 指定端口
jhat -port 7000 heap.hprof
# 禁止对象引用分析(加快加载速度)
jhat -J-Xmx2g -port 7000 heap.hprof
启动jhat后,默认会在7000端口启动一个HTTP服务,可以通过浏览器访问:
http://localhost:7000/
jstat(Java Virtual Machine Statistics Monitoring Tool)用于监控JVM的各种统计信息,包括类加载、垃圾回收、JIT编译等。
bash# 基本语法
jstat -<option> <pid> [<interval> [<count>]]
# 监控垃圾回收情况
jstat -gc <pid> 1000 10
# 监控垃圾回收情况(带时间戳)
jstat -gcutil <pid> 1000 10
# 监控类加载情况
jstat -class <pid> 1000 10
# 监控JIT编译情况
jstat -compiler <pid> 1000 10
jstat -gcutil
输出示例:
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 96.88 45.12 35.25 95.52 91.03 10 0.123 3 0.456 0.579
各列含义:
hprof是JVM内置的分析工具,可以收集CPU使用、堆分配和线程争用等数据。
hprof需要通过JVM启动参数启用:
bash# CPU使用分析
java -agentlib:hprof=cpu=samples,interval=20,depth=3 MyApp
# 堆分配分析
java -agentlib:hprof=heap=sites MyApp
# 线程争用分析
java -agentlib:hprof=monitor=y,thread=y MyApp
hprof会将分析结果输出到java.hprof.txt文件中。
JDK提供的这些工具构成了一个完整的Java应用性能监控和故障诊断工具箱:
工具 | 主要功能 | 适用场景 |
---|---|---|
jps | 列出Java进程 | 快速查找Java进程 |
jstack | 线程堆栈分析 | 死锁、CPU高、线程阻塞分析 |
jmap | 堆内存分析 | 内存泄漏、堆转储生成 |
jhat | 堆转储分析 | 离线分析内存问题 |
jstat | JVM统计监控 | 实时监控GC、内存使用情况 |
hprof | CPU、内存、线程分析 | 性能分析、热点方法定位 |
掌握这些工具的使用方法,能够帮助开发者快速定位和解决Java应用中的各种性能问题和故障。在实际工作中,建议将这些工具与可视化工具(如VisualVM、JConsole等)结合使用,以获得更好的分析体验。