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

Zty*_*tyx 14 java openjdk jvm

我知道-XX:+HeapDumpOnOutOfMemoryErrorJVM参数.我也知道-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"吗?

apa*_*gin 22

java -XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError="kill -9 %p" TestApp
Run Code Online (Sandbox Code Playgroud)

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


fla*_*nze 13

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

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

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

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

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

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

  • 这可能是一个愚蠢的问题,但这些标志是否相互排斥? (3认同)