如何在OutOfMemoryError _over_进行堆转储后重新启动JVM?

问题描述:

我知道关于-XX:+HeapDumpOnOutOfMemoryError JVM参数。我也知道-XX:OnOutOfMemoryError="cmd args;cmd args"kill -3 <JVM_PID>将请求堆转储。如何在OutOfMemoryError _over_进行堆转储后重新启动JVM?

问:我怎样才能确保我,在OutOfMemoryError,首先使一个完整堆转储和然后强制重新启动(或杀死)转储完成后?我最好的选择-XX:OnOutOfMemoryError="kill -3 %p;sleep <time-it-takes-to-dump>;kill -9 %p"

+2

那岂不是更好地从没有JVM监视过程,并据此重新启动它,例如unix脚本,监视系统?如果jvm内存不足,我不想依靠它来可靠地启动一个命令来重启它自己 – vikingsteve

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

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

我敢打赌,运行时会在崩溃时设置特定的错误级别。检查那个返回码并在这种情况下重新运行程序。你也许应该把它写成脚本。

sun jre允许你在oome堆转储,或许openjdk也是如此。

如果你只是想关机,您可以使用下列参数之一:在Java版本8u92加入

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

VM参数,请参阅release notes

ExitOnOutOfMemoryError
当你启用这个选项,退出JVM内存外的一个错误的 第一次出现。如果 更喜欢重新启动JVM的实例,而不是处理内存错误,则可以使用它。

CrashOnOutOfMemoryError
如果启用该选项,当 了内存不足的错误时,JVM崩溃并产生文本和二进制 崩溃文件。

改进请求:JDK-8138745(参数命名是错误的,虽然JDK-8154713ExitOnOutOfMemoryError代替ExitOnOutOfMemory