JDK trouble-shooting tools


发布于 2024-03-15 / 68 阅读 / 0 评论 /
对于Java来说,JDK工具是分析JVM运行过程中各种OOM、Stucked等的工具。 jmap jmap工具用来打印指定java进程的详细信息。命令行格式为: jmap [options] pid 其中,options为可用命令行选项,pid表示java进程的进程号。具体options信息如下表所

对于Java来说,JDK工具是分析JVM运行过程中各种OOM、Stucked等的工具。

jmap

 jmap工具用来打印指定java进程的详细信息。命令行格式为:

jmap [options] pid

其中,options为可用命令行选项,pid表示java进程的进程号。具体options信息如下表所示:

option

功能

-clstats pid

连接到正在运行的java进程,并打印java堆的类加载信息

-finalizerinfo pid

连接到正在运行的java进程,并打印对象等待finalize的信息

-histo[:live] pid

连接到正在运行的java进程,并打印java对象占用堆内存的统计信息。如果加上:live则只计算活着的对象。

-dump:dump_options pid

连接到正在运行的java进程,并打印java堆内存dump信息。其中dump_options包括:live,只dump活着的对象,如果未指定,则dump所有堆中的对象;format=b,把java堆内存信息以hprof二进制格式存储;file=filename,把堆内存信息dump到指定文件。

例如:jmap -dump:live,format=b,file=heap.bin pid

jstack

jstack可打印java线程的栈信息。命令行格式为:

jstack [options] pid

其中,options为可用命令行选项,pid表示java进程的进程号。具体options信息如下表所示:

option

功能描述

-l

打印锁信息

-h or --help

输出help信息

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()”。