我知道-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"
?
答案 0 :(得分:21)
++
JVM将首先转储堆,然后执行OnOutOfMemoryError命令(proof)。
答案 1 :(得分:11)
如果您只想关机,可以使用以下参数之一:
-XX:+ExitOnOutOfMemoryError
-XX:+CrashOnOutOfMemoryError
在Java版本8u92中添加了VM参数,请参阅release notes。
<强> ExitOnOutOfMemoryError 强>
启用此选项后,JVM将退出 第一次出现内存不足错误。如果你可以使用它 更喜欢重新启动JVM的实例而不是处理掉 记忆错误。<强> CrashOnOutOfMemoryError 强>
如果启用此选项,则启用此选项 发生内存不足错误,JVM崩溃并生成文本和 二进制崩溃文件。
增强请求:JDK-8138745(参数命名错误JDK-8154713,ExitOnOutOfMemoryError
而不是ExitOnOutOfMemory
)
答案 2 :(得分:0)
我敢打赌,运行时会在崩溃时设置一个特定的错误级别。检查该返回码并在该情况下重新运行程序。您应该将其放入脚本中。
sun jre允许你在oome上堆积转储,也许openjdk也可以。