当 Java 应用程序挂起时,您甚至不知道导致此问题的用例并想要调查,我知道线程转储可能很有用。
但是我们如何才能轻松地从线程转储中获取有用的数据以找出问题所在呢?我一直在使用的服务器应用程序会产生非常长的线程转储,因为它是一个 EJB 架构,并且线程转储包含许多我不确定是否应该查看的容器线程(即没有运行我的应用程序代码的线程,而是 JBoss 的代码)。
昨天我尝试了Thread Dump Analyzer工具。该工具绝对比在文本编辑器中查看原始线程转储更好,因为您可以过滤掉您不感兴趣的线程,查看线程列表,单击线程以查看其详细信息,比较线程转储以查找长时间运行的线程等。
但仍有太多数据需要分析 - 将近 300 个线程。我不知道有什么标准可以用来过滤掉我不感兴趣的所有 JBoss 线程。我不确定我是否应该只查看当前处于“可运行”状态的线程,或者“等待条件”和“在 Object.wait 中”是否也很重要。
您通常遵循的方法和您通常使用的工具是什么?
最佳答案
我知道这是一个老问题,但我刚刚编写了一个工具来帮助使长线程转储更具可读性。
Java Thread Dump Analysis Tool
此工具将具有相同堆栈跟踪的线程分组在一起,并允许您仅显示处于特定状态(例如 RUNNABLE 或 BLOCKED)的线程。
这使得在数十或数百个 JBoss 线程中找到感兴趣的线程变得更快一些,这些线程大部分时间都在代码中的同一位置等待工作,因此都具有相同的堆栈跟踪。
关于java - 线程转储分析工具/方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3156434/