【问题标题】:How to get Java Heap Dump from a Kubernetes Pod using jmap?如何使用 jmap 从 Kubernetes Pod 获取 Java 堆转储?
【发布时间】:2021-07-25 13:21:32
【问题描述】:

我按照这里提到的步骤How to get a heap dump from Kubernetes k8s pod?

我可以在 pod 中使用 top 命令获取进程 ID。但是,当我运行 jmap 时,我得到了这个:

~ $ jmap
sh: jmap: not found

我使用以下命令访问 pod:kubectl exec -it -- sh

我也试过这个命令:

kubectl exec -it <pod> -- jmap -dump:live,format=b,file=heapdump.bin 1

但我得到了:

OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused "exec: \"jmap\": executable file not found in $PATH": unknown command terminated with exit code 126

还有其他方法可以从 pod 中获取 java 堆转储吗?

【问题讨论】:

  • 很可能容器中没有安装jmap,所以不能在容器中使用jmap。这可能只是一个路径问题,尽管我对此表示怀疑。我认为 jmap 在 JDK 中,但不在 JRE 中,并且通常,我会说容器化应用程序中不需要完整的 JDK。你是程序员吗?这种情况可以重复吗?然后用 JDK 构建一个容器来做任何你想做的事情。

标签: java kubernetes heap-memory dump


【解决方案1】:

通常容器受限于可用的工具(就像你得到“更多”,但你没有得到“更少”),所以可用的工具取决于你的容器。

用于获取堆转储的 2 个工具是 jmap 和 jcmd,请检查容器中是否有 jcmd。

https://www.adam-bien.com/roller/abien/entry/taking_a_heap_dump_with

如果没有,我建议将 java 应用程序放在具有 jmap 或 jcmd 的容器中,然后运行它;即使容器“更重”也不会影响 java 应用程序或堆转储,所以它是相同的。

如果这不是一个选项,也许这将是 https://techblog.topdesk.com/coding/extracting-a-heap-dump-from-a-running-openj9-java-process-in-kubernetes/ (不是我的)。

【讨论】:

    猜你喜欢
    • 2021-01-15
    • 2013-02-14
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2014-01-16
    • 1970-01-01
    相关资源
    最近更新 更多