Как я могу перезапустить JVM в OutOfMemoryError _after_, создав дамп кучи?

Я знаю параметр -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, см. Примечания к выпуску.

ExitOnOutOfMemoryError
Когда вы включаете эту опцию, JVM завершает работу при первом появлении ошибки нехватки памяти. Его можно использовать, если вы предпочитаете перезапускать экземпляр JVM, а не обрабатывать ошибки нехватки памяти.

CrashOnOutOfMemoryError
Если эта опция включена, то при возникновении ошибки нехватки памяти JVM аварийно завершает работу и создает текстовые и двоичные файлы сбоев.

Запрос на улучшение: JDK-8138745 (неправильное именование параметров, хотя JDK-8154713, ExitOnOutOfMemoryError вместо ExitOnOutOfMemory)

Ответ 3

Я уверен, что время выполнения задает определенный уровень ошибок при сбое. Проверьте этот код возврата и перезапустите программу в этом случае. Вы должны поместить это в script.

Sun jre позволяет вам кучи дампа на oome, возможно, openjdk тоже.

Ответ 4

когда я даю tomcat -XX: + ExitOnOutOfMemoryError -Xms512m -Xmx2048m, он не может выйти, когда OutOfMemoryError.if я даю -Xms64m -Xmx256m, он работает нормально. Как мне это сделать?