如何从Kubernetes(k8s)的pod中获取堆转储(heap dump)?

20

请提供一个简单的,逐步指南,以便从Kubernetes pod中查看Java堆转储。

1个回答

27
  1. 登录 K8S 并进入运行你的 Java 应用程序的 Pod。
kubectl exec -it herle-deployment-pod-5757d89d85-wrpc9 bash
  1. 获取进程ID(top命令)

  2. 创建Java堆转储

jmap -dump:live,format=b,file=<file_name>.bin <process_id>

示例:

jmap -dump:live,format=b,file=application_heap_dump.bin 1
  1. 将堆转储从Pod复制到本地计算机。
kubectl cp <pod_name>:<heap_file> <your local destination directory>

示例:

kubectl cp herle-deployment-pod-5757d89d85-wrpc9:/tmp/application_heap_dump.bin /Users/amritharajherle/Desktop/application_heap_dump.bin
  1. 使用任何内存泄漏分析工具,我使用Eclipse的Memory Analyzer插件。
  • 打开堆转储文件

打开堆转储文件

  • 选择泄漏嫌疑报告

选择泄漏嫌疑报告

  • 您可以检查对象数量和保留堆空间。还可以查看可能存在的泄漏嫌疑对象。

我在收到以下错误: “jmap”:在$PATH中找不到可执行文件:“未知命令以退出码126终止。” - Vineeth NG
1
一点提示:最好不要在运行堆转储之前使用“live”参数来防止垃圾回收运行。 - vinayhudli
kill -3 JAVA_PID 注意Java进程的进程ID号(例如使用top命令、在ps -axw上进行grep等),并使用kill -QUIT或kill -3命令向该进程发送QUIT信号。例如: - Ankireddy Polu
jmap在adoptopenjdk/openjdk8:alpine-slim Java镜像中不存在,但很可能会有jcmd。请使用以下命令:jcmd 2960 GC.heap_dump c:/temp/heapdump.hprof - Raja Nagendra Kumar
1
@VineethNG 如果您的镜像中没有jmap,则可以使用临时容器或类似robusta.dev(免责声明:我是维护者)的东西。有关后者,请参见https://home.robusta.dev/java - Natan Yellin
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接