繁体   English   中英

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

[英]How can I restart JVM on OutOfMemoryError _after_ making a heap dump?

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM