首页 > 解决方案 > 如何将jstack输出重定向到文件?

问题描述

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

我尝试由系统用户运行 java 和 jstack ,但仍然没有运气将pitut重定向到文件。我用过java 8和9。

PS:我在谷歌上搜索过这个问题,发现有人遇到与 jstack 或 jmap 的输出文件不一致的情况。如果您对此问题有任何可行的解决方案,请告诉我。

标签: javathread-dumpjstack

解决方案


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

sudo jstack <PID> > a.txt

以上应该可以工作,因为您提到您可以在终端上看到线程转储。

但你也提到 jstack 输出

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

因此,您的进程本身可能存在问题,我认为它没有正确加载。解决这个问题,jstack应该对你有用。


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

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

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


推荐阅读