【问题标题】:How can I restart JVM on OutOfMemoryError _after_ making a heap dump?如何在 OutOfMemoryError _after_ 进行堆转储时重新启动 JVM?
【发布时间】:2015-08-12 08:23:46
【问题描述】:

我知道-XX:+HeapDumpOnOutOfMemoryError JVM 参数。我也知道-XX:OnOutOfMemoryError="cmd args;cmd args"kill -3 <JVM_PID> 将请求堆转储。

问题:我如何确保在OutOfMemoryError 上首先进行完整的堆转储,然后然后在转储后强制重启(或终止)已经完成了?我最好的选择是-XX:OnOutOfMemoryError="kill -3 %p;sleep <time-it-takes-to-dump>;kill -9 %p"吗?

【问题讨论】:

  • 在没有 jvm 的情况下监控进程并相应地重新启动它会不会更好,例如unix脚本,监控系统?如果 jvm 内存不足,我不想依靠它来可靠地启动命令以重新启动自己

标签: java jvm openjdk


【解决方案1】:
java -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError="kill -9 %p" TestApp

JVM会先dump heap,然后执行OnOutOfMemoryError命令(proof)

【讨论】:

    【解决方案2】:

    如果您只想关机,可以使用以下参数之一:

    • -XX:+ExitOnOutOfMemoryError
    • -XX:+CrashOnOutOfMemoryError

    在 Java 版本 8u92 中添加了 VM 参数,请参阅 release notes

    ExitOnOutOfMemoryError
    启用此选项时,JVM 会在 第一次出现内存不足错误。如果你可以使用它 更喜欢重新启动 JVM 实例而不是处理 记忆错误。

    CrashOnOutOfMemoryError
    如果启用此选项,当 发生内存不足错误,JVM 崩溃并生成文本和 二进制崩溃文件。

    增强请求:JDK-8138745(参数命名错误,尽管JDK-8154713ExitOnOutOfMemoryError 而不是ExitOnOutOfMemory

    【讨论】:

    • 这可能是一个愚蠢的问题,但是这些标志是互斥的吗?
    • @gregsilin 看着changeset in mercurial,看起来当提供两个选项时会优先考虑崩溃
    【解决方案3】:

    我敢打赌,运行时会在崩溃时设置特定的错误级别。检查该返回码并在这种情况下重新运行程序。您或许应该将其放入脚本中。

    sun jre 允许您在 oome 上堆转储,也许 openjdk 也可以。

    【讨论】:

      猜你喜欢
      • 2018-11-26
      • 2011-08-29
      • 1970-01-01
      • 2013-09-02
      • 2011-03-04
      • 2016-08-28
      • 2013-08-28
      • 2020-04-27
      • 1970-01-01
      相关资源
      最近更新 更多