我的 java 应用程序有 100 多个线程,每个线程都在做类似的事情。使用jstack可以打印所有线程的堆栈,但是信息太多,是否可以打印java的特定线程的堆栈?例如只打印一个java 应用程序的id 为100 的线程。
问问题
104 次
2 回答
2
您可以使用ThreadMXBean MBean的getThreadInfo方法。它允许您传递一个线程 ID,它将返回一个ThreadInfo数据类型,其中包含堆栈跟踪、线程状态等。
编辑:我还应该补充一点,如果您正在寻找外部的东西,您可以使用jVisualVM的Threads Inspector插件。它工作得非常好,并允许您选择实时显示堆栈的线程。此外,jVisualVM 是免费的,并且与 JDK 捆绑在一起(例如 JDK_location/bin/)。线程检查器插件也是免费的,可以通过打开 jVisualVM > 工具 > 插件 > 可用插件来安装。
于 2014-07-31T04:56:06.833 回答
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;
}
}
}
于 2014-07-31T04:59:55.633 回答