【问题标题】:fast heap dumps but on out of memory快速堆转储但内存不足
【发布时间】:2022-01-21 16:49:50
【问题描述】:

我们都知道很好的旧标志 +HeapDumpOnOutOfMemoryError 在 JVM 内存不足时进行堆转储。问题在于,对于大型堆,这需要越来越多的时间。

有一种方法可以使用 GNU 调试器进行快速堆转储... 您有效地获取进程的核心文件(非常快),然后使用 jmap 将其转换为 heapdump 格式...这是工作中最慢的部分。

但是,这仅在您手动执行时,当您的 java 应用程序在容器中运行时,通常会有一个固定的超时,直到您的应用程序将被非正常终止...对于 kube,我相信默认为 30 秒。

出于多种原因,我不想将此超时延长到更大的数字。当java内存不足时,有没有办法只触发核心文件转储?或者我们只是受限于+HeapDumpOnOutOfMemoryError 标志提供的任何东西?

【问题讨论】:

    标签: java memory-leaks


    【解决方案1】:

    我可以想到 2 种可能的解决方案,但它不仅适用于内存不足的情况,而且还会崩溃:

    1. 您可以使用 java 的 -XX:OnError 选项来运行您自己的脚本或 gcore,(gdb) generate-core-file(取决于您的操作系统)来创建一个核心转储,您以后可以使用调试器(如 gdb)来附在上面。

    2. 您可以按照操作系统提供的方式在操作系统中启用自动核心转储。 对于红帽

    启用:将文件 /etc/systemd/system.conf 中的相关行编辑为DefaultLimitCORE=infinity

    重启并取消ulimit -c unlimited的核心转储限制。

    当您的应用程序崩溃时,必须在其工作目录中创建哑元。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 2019-12-16
      • 2012-10-07
      • 2015-11-09
      • 2019-02-20
      • 2013-09-10
      相关资源
      最近更新 更多