对于Java来说,JDK工具是分析JVM运行过程中各种OOM、Stucked等的工具。
jmap
jmap工具用来打印指定java进程的详细信息。命令行格式为:
jmap [options] pid
其中,options为可用命令行选项,pid表示java进程的进程号。具体options信息如下表所示:
jstack
jstack可打印java线程的栈信息。命令行格式为:
jstack [options] pid
其中,options为可用命令行选项,pid表示java进程的进程号。具体options信息如下表所示:
jstack标准输出
每一个线程的堆栈信息第一行的信息例如:
"mysql-cj-abandoned-connection-cleanup" #16 daemon prio=5 os_prio=0 cpu=50.54ms elapsed=408.29s tid=0x00007f4e0d959000 nid=0x187c in Object.wait() [0x00007f4dc8717000]
各字段说明如下:
mysql-cj-abandoned-connection-cleanup:表示线程名称。
#16:表示线程号为16。
daemon:表示守护进程。
prio=5:表示优先级为5。
os_prio=0:表示操作系统内部优先级为0。
cpu=50.54ms:表示占用CPU的时间片总时间为50.54ms。
elapsed=408.29s:表示线程启动后经过的wall clock time。
tid:表示线程的内存地址。
nid:表示线程的操作系统编号,十六进制格式的。
Waiting on condition:线程的操作系统状态。
in Object.wait():表示线程状态。
线程状态
线程状态不仅有in Object.wait(),还有以下5种:
Deadlock:线程死锁。
Runnable:线程正在执行。
Waiting on condition:等待资源,或等待某个条件的发生。可能是网络阻塞,也可能是线程在sleep。
Blocked:线程阻塞。
Waiting for monitor entry 和 in Object.wait():Monitor是 Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的锁。每一个对象都有,也仅有一个 monitor。从下图可看出,每个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 “Active Thread”,而其它线程都是 “Waiting Thread”,分别在两个队列 “ Entry Set”和 “Wait Set”里面等候。在 “Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在 “Wait Set”中等待的线程状态是 “in Object.wait()”。