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

2022-09-02 05:15:33

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


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

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


答案 2

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

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

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

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

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

增强请求:JDK-8138745(参数命名错误,尽管 JDK-8154713,而不是ExitOnOutOfMemoryErrorExitOnOutOfMemory)


推荐