Java 问题排查常见工具

原文(部分调整):调试排错 - Java 问题排查之工具单

jps

jps 全称 Java Virtual Machine Process Status Tool,是 JDK 提供的一个查看 Java 进程的命令行工具,常用来快速定位 Java 进程 ID。

jps 常用命令:

jps # 显示进程的 ID 和主启动类类名
jps –l # 输出主启动类的包名,或 jar 包的完全路径名
jps –v # 输出 jvm 参数
jps –q # 仅显示 Java 进程号
jps -m # 输出传递给 main 方法的参数,对于嵌入式 JVM,输出可能为空
jps -l xxx.xxx.xx.xx # 远程查看

jps 参数:

-q:仅输出 VM 标识符
-m:输出 main 方法的参数
-l:输出完全的包名,应用主类名,jar 的完全路径名
-v:输出 jvm 参数
-V:输出通过 flag 文件传递到 JVM 中的参数(.hotspotrc 文件或 -XX:Flags= 所指定的文件)

更多请参考 jps - Java Virtual Machine Process Status Tool

jstack

jstack 是 JDK 自带的线程堆栈分析工具,使用该命令可以查看或导出 Java 应用程序中线程堆栈信息。

jstack 常用命令:

# 基本
jstack 2815

# Java 和 Native C/C++ 框架的所有栈信息
jstack -m 2815

# 额外的锁信息列表,查看是否死锁
jstack -l 2815

jstack 参数:

-l 长列表,打印关于锁的附加信息,例如属于 java.util.concurrent 的 ownable synchronizers 列表

-F 当 jstack [-l] pid 没有相应值的时候强制打印栈信息

-m 打印 Java 和 Native C/C++ 框架的所有栈信息

-h | -help 打印帮助信息

排查问题时,通常利用 top 命令可以查出占 CPU 最高的线程 pid:

top -Hp {pid} # 查看进程的线程信息,进入后按 P 键按 CPU 使用率排序,找到占用 CPU 高的线程

然后将线程 ID 转换为 16 进制形式(因为 Java Native 线程以 16 进制形式输出):

printf '%x\n' {thread-pid}

然后使用 jstack 命令查看线程堆栈信息:

jstack {pid} | grep '{16-thread-pid}' -A 50 --color

更多请参考:jvm 性能调优工具之 jstack

jinfo

jinfo 是 JDK 自带的命令,可以用来查看正在运行的 Java 应用程序的扩展参数,包括 Java System 属性和 JVM 命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo 可以从 core 文件里面知道崩溃的 Java 应用程序的配置信息

jinfo 常用命令:

# 输出当前 jvm 进程的全部参数和系统属性
jinfo 2815

# 输出所有的参数
jinfo -flags 2815

# 查看指定的 jvm 参数的值
jinfo -flag PrintGC 2815

# 开启/关闭指定的 JVM 参数
jinfo -flag +PrintGC 2815

# 设置 flag 的参数
jinfo -flag name=value 2815

# 输出当前 jvm 进行的全部的系统属性
jinfo -sysprops 2815

jinfo 参数:

no option 输出全部的参数和系统属性
-flag name 输出对应名称的参数
-flag [+|-]name 开启或者关闭对应名称的参数
-flag name=value 设定对应名称的参数
-flags 输出全部的参数
-sysprops 输出系统属性

更多请参考:jvm 性能调优工具之 jinfo

jmap

jmap (Java Memory Map) 是一个多功能的命令。它可以生成 Java 程序的 dump 文件,也可以查看堆内对象实例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。

两个用途

# 查看堆的情况
jmap -heap 2815

# 生成堆转储文件(Heap Dump)
jmap -dump:format=b,file=/tmp/heap3.hprof 2815
# 添加 live 参数仅导出存活对象(减少文件大小、更贴近实际内存占用)
jmap -dump:live,format=b,file=/tmp/heap2.hprof 2815

# 对象统计直方图(按类统计实例数和内存占用)
jmap -histo 2815 | head -10
# 添加 live 参数仅统计存活对象(会触发 Full GC!慎用生产环境)
jmap -histo:live 2815 | head -10

jmap 参数

no option:查看进程的内存映像信息,类似 Solaris pmap 命令。
heap:显示 Java 堆详细信息
histo[:live]:显示堆中对象的统计信息
clstats:打印类加载器信息
finalizerinfo:显示在 F-Queue 队列等待 Finalizer 线程执行 finalizer 方法的对象
dump:<dump-options>:生成堆转储快照
F:当-dump 没有响应时,使用-dump 或者-histo 参数. 在这个模式下,live 子参数无效.
help:打印帮助信息
J<flag>:指定传递给运行 jmap 的 JVM 的参数

更多请参考:jvm 性能调优工具之 jmapjmap - Memory Map

jstat

jstat 参数众多,但是使用一个就够了:

jstat -gcutil 2815 1000 # 显示 GC 使用情况,间隔 1000ms 输出一次
posted @ 2025-11-10 22:04  Higurashi-kagome  阅读(15)  评论(0)    收藏  举报