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