0

我想生成正在运行的应用程序的线程转储。但是,当我杀死 -3 PID 时,它会在正在运行的应用程序的控制台上生成线程转储。

我想将它生成到一个文件中。我知道我可以将应用程序作为 ./run.sh > thread_dump 运行,或者我也可以使用 jstack 实用程序将其重定向到文件。

但是,我不想使用其中任何一个。在另一种方法中,我通过以下方式将控制台的完整输出重定向到文件:

            File file = new File("out.txt");
    FileOutputStream fos = new FileOutputStream(file);
    PrintStream ps = new PrintStream(fos);
    System.setOut(ps);

现在每个输出都写在 out.txt 中。但是,当我确实 kill -3 时,它会将线程转储写入控制台。

我在第三种方法中缺少什么?有人会知道,在 JVM 上调用 kill -3 时会调用什么类/源,以便我可以查看在发出 kill -3 请求/命令时如何准确编写线程转储?

4

1 回答 1

0

您需要使用jmap -dump选项来转储正在运行的应用程序的堆转储。这是 oracle 网站上的一个有趣的博客,描述了如何以编程方式从 Java 应用程序中转储堆。

https://blogs.oracle.com/sundararajan/entry/programmatically_dumping_heap_from_java

于 2013-07-29T08:54:07.243 回答