如何在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"
?
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-8154713,ExitOnOutOfMemoryError
代替ExitOnOutOfMemory
)
那岂不是更好地从没有JVM监视过程,并据此重新启动它,例如unix脚本,监视系统?如果jvm内存不足,我不想依靠它来可靠地启动一个命令来重启它自己 – vikingsteve