
本文已收录于《JVM生产环境问题定位与解决实战》专栏,完整系列见文末目录
1. 引言
Java开发工具包(JDK)内置了强大的诊断工具集,用于监控、分析和调试Java应用程序。这些工具涵盖了从进程管理、内存分析到性能监控的各个方面。本文将介绍一些最常用的Java开发工具,包括jps、jmap、jstat、jcmd、jstack、jvisualvm等,并提供它们的具体应用场景及使用方法,来帮助开发者快速定位运行时问题。
JDK诊断工具全解析与实战指南
一、核心命令行工具详解
1. 进程管理工具 jps
场景
jps是Java自带的一个命令行工具,用于显示当前系统中所有Java应用程序的简要信息。它对于快速获取运行中的Java进程ID(PID)及其主类名非常有用,尤其是在需要连接到特定进程进行进一步分析或管理时。
使用方法
- 查看所有Java进程的基本信息:只需简单地执行
jps命令。 - 获取更详细的信息:可以通过添加参数如
-l来显示完整包路径的主类名,-m来查看传递给main方法的参数,或者-v来查看传递给JVM的选项。在Linux系统中,常使用ps -ef | grep java来过滤出所有包含“java”字符串的进程的详细信息。有了jps可以精确地定位到特定的Java应用程序的进程。如果只是为了查java程序的进程号,jps -l可能会更加简洁的列出你想查找的内容。
jps -q # 仅显示进程ID(PID)
jps -l # 显示完整包路径
jps -v # 显示JVM启动参数
jps -m # 显示main方法参数
| 参数 | 功能说明 | 示例 |
|---|---|---|
| -q | 只显示 PID | jps -q → 38721 |
| -m | 显示 main 方法参数 | jps -m → 38721 MyApp arg1 |
| -l | 显示完整包名/jar路径 | jps -l → com.example.Main |
| -v | 显示 JVM 参数 | jps -v → -Xmx1024m |
| -V | 显示 JVM 参数(不包含应用参数) | jps -V → -XX:MaxPermSize=256m |
2. 内存分析工具 jmap
场景
jmap用于生成Java堆的快照(heap dump),这对于诊断内存泄漏等问题至关重要。此外,它还可以显示Java进程的内存映射或共享对象统计信息。
使用方法
- 创建堆转储文件:
jmap -dump:format=b,file=heap.bin <pid>,其中<pid>为Java进程ID。 - 查看对象分配直方图:
jmap -histo <pid>可以列出每个类实例的数量和总大小。
1. 标准参数
jmap [option] <pid>
| 参数 | 功能说明 | 注意事项 |
|---|---|---|
| -heap | 显示堆内存分布 | 可能导致服务暂停 |
| -histo[:live ] | 对象内存直方图统计 | live 参数触发 Full GC |
| -clstats | 类加载器统计(JDK8+) | 需要 attach 权限 |
| -finalizerinfo | 显示等待 finalization 的对象 | 输出信息有限 |
| -dump: | 生成堆转储文件 | 示例:format=b,file=heap.bin |
2. 堆转储选项
jmap -dump:live,format=b,file=heap.hprof 38721
| 选项 | 说明 |
|---|---|
| live | 只转储存活对象 |
| format=b | 二进制格式(必须) |
| file= | 输出文件名 |
| compression=6 | 压缩级别(0-9,JDK13+) |

3. 线程分析工具 jstack
场景
jstack用来生成Java进程的线程转储,这有助于理解程序在某一时刻的线程状态,主要用于捕获线程执行堆栈 、诊断死锁/CPU热点 。 对于排查死锁、响应慢等问题特别有效。
使用方法
- 打印线程转储:
jstack <pid>直接输出线程转储信息到标准输出。 - 将线程转储保存到文件:
jstack <pid> > thread_dump.txt
jstack -l <pid> # 显示锁附加信息
jstack -F <pid> # 强制生成线程快照(用于挂起进程)
jstack -m <pid> # 混合模式(显示Java和Native栈帧)
| 参数 | 功能说明 | 使用场景 |
|---|---|---|
| -F | 强制生成线程快照 | 进程无响应时使用 |
| -l | 显示锁信息(长格式) | 分析死锁必备 |
| -m | 混合模式(显示 native 栈) | JNI 调用问题分析 |
| -J | 传递参数到 JVM | 示例:-J-d64 使用64位模式 |
转存文件分析:如何分析转存文件,包括使用jmap创建堆转储、jstac

最低0.47元/天 解锁文章
1645

被折叠的 条评论
为什么被折叠?



