有可能获得Java应用程序的特定线程的调用堆栈?

时间:2014-07-31 04:40:29

标签: java jstack

我的java应用程序有超过100个线程,每个线程都在做类似的事情。使用jstack可以打印所有线程的堆栈,但是有太多的信息,是否可以打印java的特定线程的堆栈?例如,只打印id为100的Java应用程序的线程。

2 个答案:

答案 0 :(得分:2)

您可以使用getThreadInfo MBean的ThreadMXBean方法。它允许您传递一个线程ID,它将返回一个ThreadInfo数据类型,其中包含堆栈跟踪,线程状态等。

编辑:我还应该补充一点,如果您正在寻找外部的东西,可以使用Threads Inspector插件jVisualVM。它工作得非常好,并允许您选择实时显示堆栈的线程。此外,jVisualVM是免费的,并与JDK捆绑在一起(例如JDK_location / bin /)。 Threads检查器插件也是免费的,可以通过打开jVisualVM>来安装。工具>插件>可用的插件。

答案 1 :(得分:1)

您可以使用Thread.getAllStackTraces()获取所有活动线程的所有堆栈跟踪的Map。使用Map搜索Thread.getId()以查找具有您要打印的ID的线程。然后Thread.dumpStack()打印该线程的堆栈。

示例代码:

public void printStack(int threadId) {
  for (Thread thread : Thread.getAllStackTraces().keySet()) {
    if (thread.getId() == threadId) {
      thread.dumpStack();
      break;
    }
  }
}