如果我想生成一个线程转储并将其记录在我的应用程序中(用于诊断目的),是否有任何用于生成一个的实用程序,或者我是否一直在将自己拼凑在一起?
答案 0 :(得分:1)
这是这个问题的半复制品。看看我的答案:
这会对您执行kill -QUIT <my-pid>
时看到的输出进行近似。不确定与JVisualVM输出匹配多少。
Thread stack dump method is posted on pastebin的完整代码。代码示例在列出的问题中。
答案 1 :(得分:0)
您是否按照Determining Current Call Stack (For Diagnostic Purposes)中的建议尝试StackTraceElement[] cause = Thread.currentThread().getStackTrace();
。
相关问答:
答案 2 :(得分:0)
我目前正在使用此功能。不确定它是否正是你想要的。
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
public class ThreadDumper
{
public static String dumpThreads()
{
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
try
{
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] threadInfos = bean.getThreadInfo(bean.getAllThreadIds(), Integer.MAX_VALUE);
for (int i = 0; i < threadInfos.length; i++)
{
ThreadInfo threadInfo = threadInfos[i];
pw.print(threadInfo);
}
pw.println("----------------------------------------");
pw.println();
long[] deadlockedIds = bean.findMonitorDeadlockedThreads();
if(deadlockedIds == null || deadlockedIds.length == 0)
{
pw.println("Detected 0 deadlocked threads.");
}
else
{
pw.println("Detected " + deadlockedIds.length + " deadlocked threads:");
threadInfos = bean.getThreadInfo(deadlockedIds, 0);
for (int i = 0; i < threadInfos.length; i++)
{
ThreadInfo threadInfo = threadInfos[i];
pw.print(threadInfo);
}
}
}
catch(Exception e)
{
pw.println("----------------------------------------");
pw.println("Exception occurred while taking thread dump:");
e.printStackTrace(pw);
pw.println("----------------------------------------");
}
return sw.toString();
}
}