有没有一种简单的方法可以为每个 运行 jvm 生成一个 jstack?
Is there a simple way to generate a jstack for each running jvm?
我想这样走
jstack 所有
或类似的东西,这样我就可以获得系统上所有 jvms 的线程转储。
可以吗?
您可以 运行 在您的终端中执行以下操作:
ps -e | grep [j]ava | awk '{print }' | xargs -n 1 jstack
jstack command reference 提供了这三种调用形式:
jstack [ options ] pid
jstack [ options ] executable core
jstack [ options ] [ server-id@ ] remote-hostname-or-IP
其中,只有第一个与运行 jstack
的同一系统上当前 运行 的 JVM 相关。因此,您必须通过 pids 来识别 JVM 进程。
在对 pid
论点的总结中,参考注释:
To get a list of Java processes running on a machine, use the jps(1) command.
据推测,如果您有 jstack
可用,那么您也有 jps
。文档建议您可以使用 jps -q
来获取仅相关 pid 的列表,因此您不需要进行按摩。鉴于此,您可以在 bash
:
中执行类似的操作
for vmpid in $(jps -q); do
jstack $vmpid
done
显然 jps
是在 Java 中实现的,因为我发现它会自行报告。如果这让您感到困扰,那么可以调整以上内容以过滤掉 jps
本身。
我想这样走
jstack 所有
或类似的东西,这样我就可以获得系统上所有 jvms 的线程转储。
可以吗?
您可以 运行 在您的终端中执行以下操作:
ps -e | grep [j]ava | awk '{print }' | xargs -n 1 jstack
jstack command reference 提供了这三种调用形式:
jstack [ options ] pid jstack [ options ] executable core jstack [ options ] [ server-id@ ] remote-hostname-or-IP
其中,只有第一个与运行 jstack
的同一系统上当前 运行 的 JVM 相关。因此,您必须通过 pids 来识别 JVM 进程。
在对 pid
论点的总结中,参考注释:
To get a list of Java processes running on a machine, use the jps(1) command.
据推测,如果您有 jstack
可用,那么您也有 jps
。文档建议您可以使用 jps -q
来获取仅相关 pid 的列表,因此您不需要进行按摩。鉴于此,您可以在 bash
:
for vmpid in $(jps -q); do
jstack $vmpid
done
显然 jps
是在 Java 中实现的,因为我发现它会自行报告。如果这让您感到困扰,那么可以调整以上内容以过滤掉 jps
本身。