有没有一种简单的方法可以为每个 运行 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 本身。