我尝试了jstack -l <PID> >> dump.log
并创建了没有内容的dump.log文件。尽管我可以在运行Java应用程序的终端中看到线程转储,但是我需要在文件中进行线程转储。
此外,jstack输出上还显示一条消息:无法打开套接字文件:目标进程未响应或未加载HotSpot VM。
我尝试由系统用户同时运行java和jstack,但是仍然无法使pitut重定向到文件。我同时使用了Java 8和9。
PS:我在Google上搜索了此问题,发现人们在使用jstack或jmap输出文件时遇到不一致的情况。请让我知道您是否对该问题有任何可行的解决方案。
答案 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,这应该可以解决问题。