【发布时间】:2020-12-04 02:50:36
【问题描述】:
我有一个在 Kubernetes 编排的容器内运行的 java 进程。我在 docker stats 中观察到大量内存占用。
我有 -Xmx=40Gb 并且 docker stats 报告了 34.5 GiB 内存。为了更好地了解堆使用情况,我尝试使用以下命令对正在运行的进程进行堆转储:
jmap -dump:live,format=b,file=/tmp/dump.hprof $pid
但这会导致容器重启。生成的转储文件在9.5 GiB 附近,但 Eclipse Memory Analyzer 报告该文件不完整,无法打开。
Invalid HPROF file: Expected to read another 1,56,84,83,080 bytes, but only 52,84,82,104 bytes are available for heap dump record
在 kubelet 日志或容器日志中没有找到太多信息,除了可能由堆转储引起的 liveness probe failure 吗?/
到目前为止,我无法重现该问题。我只是想了解可能发生的事情以及堆转储是否会干扰我的运行过程。我知道-dump:live 标志会强制执行 GC 循环然后收集堆转储,这会干扰我的运行进程吗?
【问题讨论】:
标签: java memory-leaks heap-memory heap-dump jmap