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

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

问题:如何确保在OutOfMemoryError首先进行完全堆转储, 然后在转储完成后强制重启(或终止)? 是我最好的选择-XX:OnOutOfMemoryError="kill -3 %p;sleep ;kill -9 %p"

 java -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError="kill -9 %p" TestApp 

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

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

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

VM参数在Java版本8u92中添加,请参阅发行说明 。

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

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

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

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

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