JDK 自带了非常多的工具用于管理和监控 Java 应用程序状态,对于 Java 开发者来说,了解这些工具如何使用是非常有必要的,尤其是在排查线上问题,或者使用内部网络的情况下,可能无法或不允许使用三方工具,如 arthas,jvm-tools 等,这个时候熟练使用 JDK 自带的 jvm 工具就非常有助于我们分析和解决 jvm 的问题。接下来我将对 JDK 中自带的比较常用的工具进行介绍,同时也会穿插部分其他 jvm 分析工具的讲解。
注意:以下内容均基于 JDK-11.0.12 版本讲解,不同版本的 JDK 中,命令或许有所不同。
JPS(Java Virtual Machine Process Status Tool)是Java自带的命令行工具,用于列出当前运行的Java虚拟机(JVM)进程的信息。它提供了一种简单的方法来查看正在运行的Java进程的PID(Process ID)和主类名称。 以下是JPS命令的一般语法和选项:
jps [ options ]
常见的选项包括:
使用JPS命令可以获得以下信息:
请注意,JPS只能检测与当前用户相关的Java进程。如果您想查看其他用户的Java进程,您可能需要使用root权限或使用适当的权限来运行JPS命令。
使用示例:
jps
jps -q
jps -l
jps -m
jps -v
jstack 用于生成Java进程的线程转储(Thread Dump),以便分析和诊断Java应用程序的线程状态和问题。线程转储是指记录了Java进程中各个线程的堆栈信息,可以用来分析线程的运行状态、死锁、死循环等问题。
jstack 的一般语法如下:
jstack [-l][-e] <pid>
常见的选项包括:
使用 jstack 命令可以获得以下信息:
jstack 命令可以用于在线上或开发环境中定位和分析Java程序中的线程问题,如死锁、CPU高占用等。通常结合其他工具,如jps、jconsole、VisualVM等一起使用,以获取更全面的线程和性能信息,从而进行诊断和分析。
使用示例:
# 使用刚才 springboot-demo-0.0.1-SNAPSHOT.jar 的进程来分析堆栈
jps | grep demo | awk '{print $1}' | xargs -n 1 jstack -l > jstack.log
我们从 jstack.log 中截取一段内容,来看下这段内容表示什么意思
"Reference Handler" #2 daemon prio=10 os_prio=31 cpu=1.92ms elapsed=1359.35s tid=0x00007ff67900b800 nid=0x4403 waiting on condition [0x000070000e0a5000]
java.lang.Thread.State: RUNNABLE
at java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0.12/Native Method)
at java.lang.ref.Reference.processPendingReferences(java.base@11.0.12/Reference.java:241)
at java.lang.ref.Reference$ReferenceHandler.run(java.base@11.0.12/Reference.java:213)
Locked ownable synchronizers:
- None
"Reference Handler" #2 daemon prio=10 os_prio=31 cpu=1.92ms elapsed=1359.35s tid=0x00007ff67900b800 nid=0x4403 waiting on condition [0x000070000e0a5000]:
java.lang.Thread.State: RUNNABLE:
jstack 命令获取到的线程状态主要有以下几种:
at java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0.12/Native Method):
Locked ownable synchronizers::
-None:
除了直接查看 jstack 生成的原始文件外,也可以借助其他工具来辅助我们分析,以下是几种常用的分析工具:
------------------------ 昏割线,太困了,先睡了 ------------------------