我想生成正在运行的应用程序的线程转储。但是,当我确实杀死-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中。但是,当我确实杀-3时,它会将线程转储写入控制台。
我在第三种方法中缺少什么?有人知道,在JVM上调用kill -3时会调用哪个类/源,这样我就可以看一下如何在制作kill -3请求/命令时写入线程转储?
答案 0 :(得分:0)
您需要使用jmap -dump选项转储正在运行的应用程序的堆转储。这是oracle网站上一个有趣的博客,描述了如何以编程方式从Java应用程序转储堆。
https://blogs.oracle.com/sundararajan/entry/programmatically_dumping_heap_from_java