如何在OutOfMemoryError _after_上进行堆转储时重新启动JVM?

时间:2015-05-29 12:49:45

标签: java jvm openjdk

我知道-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"

3 个答案:

答案 0 :(得分:21)

++

JVM将首先转储堆,然后执行OnOutOfMemoryError命令(proof)

答案 1 :(得分:11)

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

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

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

  

<强> ExitOnOutOfMemoryError
  启用此选项后,JVM将退出   第一次出现内存不足错误。如果你可以使用它   更喜欢重新启动JVM的实例而不是处理掉   记忆错误。

     

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

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

答案 2 :(得分:0)

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

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