如果我想生成一个线程转储并将其记录在我的应用程序中(用于诊断目的),是否有任何实用程序可以生成一个,还是我自己拼凑在一起?
问问题
257 次
3 回答
1
这是这个问题的半重复。在这里查看我的答案:
这会近似您执行 a 时看到的输出kill -QUIT <my-pid>
。不确定与 JVisualVM 输出匹配的程度。
线程堆栈转储方法的完整代码发布在 pastebin 上。代码示例在列出的问题中。
于 2013-11-05T20:15:25.770 回答
0
您是否按照确定当前调用堆栈(用于诊断目的)StackTraceElement[] cause = Thread.currentThread().getStackTrace();
中的建议进行了尝试。
相关问答:
于 2013-11-05T19:47:45.053 回答
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();
}
}
于 2013-11-05T19:52:07.207 回答