【java】IBM Thread and Monitor Dum
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。
如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。
另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
IBM提供的分析javacore和dump的内存分析工具,非常好用。
IBM Thread and Monitor Dump Analyzer for Java (TMDA) 是允许识别 Java 线程转储中的挂起、死锁、资源争用和瓶颈的工具。
IBM Thread and Monitor Dump Analyzer for Java (TMDA)
https://www.ibm.com/support/pages/ibm-thread-and-monitor-dump-analyzer-java-tmda
https://public.dhe.ibm.com/software/websphere/appserv/support/tools/jca/jca4611.jar
在 Linux 等基于 POSIX 的系统上请求线程转储的最简单方法是发送 kill -3 信号,该信号非破坏性地暂停 JVM,创建线程转储,然后 JVM 继续(暂停通常是几百毫秒)。
例如(将 ${PID} 替换为 Java 进程的进程 ID):
$ kill -3 $PID
在 Java™ 进程的运行时,它可能无法做出可预测的响应,并且可能会挂起很长时间或直到 JVM 关闭,确定此类问题的根本原因并不容易。
通过在 Java 进程未响应时触发一个或多个线程转储,可以收集与 JVM 相关的诊断信息以及在执行期间在特定点捕获的 Java 应用程序(请注意,Java 速度变慢的另一个常见原因是垃圾收集,在在这种情况下,您应该查看详细的垃圾收集)。
例如,信息可以是关于操作系统、应用程序环境、线程、本机堆栈、锁和内存,确切的内容取决于运行应用程序的平台和 JVM。
这是 TMDA 的屏幕截图,显示单个线程转储(左半部分显示线程转储中的所有线程),按堆栈深度降序排序(因为堆栈深度通常与非空闲相关),并显示可疑的线程堆栈(右半部分)。



在Thread Dump List中右键可以查看Thread详细信息。

在IBM Thread and Monitor Dump Analyzer for Java工具中,请求线程可分为以下几种状态:
1.死锁,Deadlock(重点关注)
2.执行中,Runnable(重点关注)
3.等待资源,Waiting on condition(重点关注)
4.等待监控器检查资源,Waiting on monitor
5.暂停,Suspended
6.对象等待中,Object.wait()
7.阻塞,Blocked(重点关注)
8.停止,Parked
Deadlock:死锁线程:一般指多个线程调用间,进入相互资源占用,导致一直等待无法释放的情况。
Runnable:一般指该线程正在执行状态中,该线程占用了资源,正在处理某个请求,有可能正在传递SQL到数据库执行,有可能在对某个文件操作,有可能进行数据类型等转换。
Waiting on condition:等待资源,如果堆栈信息明确是应用代码,则证明该线程正在等待资源,一般是大量读取某资源,且该资源采用了资源锁的情况下,线程进入等待状态,等待资源的读取,又或者正在等待其他线程的执行等。
Blocked:线程阻塞,是指当前线程执行过程中,所需要的资源长时间等待却一直未能获取到,被容器的线程管
在某些平台上,在某些情况下,javacores 被称为 javadumps,创建 javacore 的代码是 JVM 的一部分。
你可以通过使用环境变量和命令行参数来控制它。
默认情况下,当 JVM 意外终止时会发生 javacore,也可以通过向 JVM 发送特定信号来触发 javacore。
尽管 HotSpot JVM 中存在线程转储(发送到 stderr 而不是 javacore.txt 文件),但 J9 JVM(IBM Java、OpenJ9)生成的 javacore 的内容要丰富得多。
该工具分析每个线程并提供诊断信息,例如当前线程信息、导致 javacore 的信号、Java 堆信息(最大 Java 堆大小、初始 Java 堆大小、垃圾收集器计数器、分配失败计数器、空闲 Java 堆大小和分配的 Java 堆大小)、可运行线程数、线程总数、锁定的监视器数和死锁信息。
IBM Thread and Monitor Dump Analyzer for Java 比较每个 javacore 并提供线程的进程 ID 信息、第一个 javacore 的时间戳、最后一个 javacore 的时间戳、每分钟垃圾收集次数、每分钟分配失败次数、第一个 javacore 和最后一个 javacore、挂起嫌疑人的数量和挂起嫌疑人列表。
此工具还比较 javacores 中的所有监视器信息,并检测死锁和资源争用或监视器瓶颈(如果有)。
TMDA 工具按原样提供,不提供任何保证或支持;但是,我们会在时间允许的情况下尝试修复和增强该工具。该工具最初由 Jinwoo Hwang 创建。自从 Hwang 先生离开 IBM 后,Kevin Grigorenko ( kevin.grigorenko@us.ibm.com )在时间允许的情况下维护该工具。
参考
Online Java Thread Dump Analyzer
http://spotify.github.io/threaddump-analyzer
Jstack分析工具——IBM Thread and Monitor Dump Analyzer for Java
https://blog.csdn.net/aovenus/article/details/116244885
Java进程故障排查思路及步骤
https://www.likecs.com/show-306377648.html
Java Thread Dump Analyzer
https://gceasy.io/ft-index.jsp
面试官:如果你们的系统 CPU 突然飙升且 GC 频繁,如何排查?
https://mp.weixin.qq.com/s/g8KJhOtiBHWb6wNFrCcLVg
通过JVM堆栈分析出现大量线程的原因
http://www.crazyant.net/1858.html
jstack线程快照-线程状态及线程堆栈信息
https://blog.csdn.net/CJQ316210/article/details/121980023