Как перезапустить JVM на OutOfMemoryError после создания дампа кучи?

Я знаю, о -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"?

3 ответов


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-8154713, ExitOnOutOfMemoryError вместо ExitOnOutOfMemory)


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

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