0

如果我想生成一个线程转储并将其记录在我的应用程序中(用于诊断目的),是否有任何实用程序可以生成一个,还是我自己拼凑在一起?

4

3 回答 3

1

这是这个问题的半重复。在这里查看我的答案:

无需重新启动即可生成 Java 线程转储。

这会近似您执行 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 回答