如何将jstack输出重定向到文件?

时间:2018-07-28 12:50:37

标签: java thread-dump jstack

我尝试了jstack -l <PID> >> dump.log并创建了没有内容的dump.log文件。尽管我可以在运行Java应用程序的终端中看到线程转储,但是我需要在文件中进行线程转储。 此外,jstack输出上还显示一条消息:无法打开套接字文件:目标进程未响应或未加载HotSpot VM。

我尝试由系统用户同时运行java和jstack,但是仍然无法使pitut重定向到文件。我同时使用了Java 8和9。

PS:我在Google上搜索了此问题,发现人们在使用jstack或jmap输出文件时遇到不一致的情况。请让我知道您是否对该问题有任何可行的解决方案。

1 个答案:

答案 0 :(得分:1)

您可以通过以下命令获取线程转储:

sudo jstack <PID> > a.txt

上面的方法应该起作用,因为您提到可以在终端上看到线程转储。

但是您还提到了jstack输出

Unable to open socket file: target process not responding or HotSpot VM not loaded.

因此,您的流程本身可能存在问题,我认为该流程未正确加载。解决了该问题,jstack应该可以为您服务。


另一个问题可能是您可能耗尽了系统中打开文件的数量。运行以下两个命令。

  • 查找每个进程的打开文件限制:ulimit -n
  • 按所有过程统计所有打开的文件:lsof | wc -l

如果以上两个命令的输出都相同,则您可能已经用尽了总的文件打开限制。因此,您将无法将输出写入文件。关闭打开的fd,这应该可以解决问题。