【问题标题】:Taking a heap dump leads to a crash进行堆转储会导致崩溃
【发布时间】: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


    【解决方案1】:

    当 JVM 处于压力之下时,我曾遇到过类似的情况。你能附上这个文件 hs_err_pid 日志吗?检查该文件后,您可以将操作系统配置为生成核心转储(以防您的系统尚未生成核心文件),您应该能够从核心文件中获取堆转储。

    在以下link 上,您可以阅读与 JDK 错误相关的类似问题。

    此外,我建议您使用这些标志启用垃圾收集器日志文件和自动堆转储。请在启用后附加 gc.log 并分配足够的存储空间以保存堆转储。

    XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=10M -Xloggc:/some/path/gc.log
    

    【讨论】:

      猜你喜欢
      • 2012-04-11
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2019-05-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多