Java из памяти затем выйти - PullRequest
2 голосов
/ 17 мая 2011

У меня есть программа, которая должна анализировать большие файлы.Ограничение ввода или предоставление бесконечной памяти не вариант, поэтому мне приходится жить с летающими ООМ.Поскольку OOME только убивает поток, мое программное обеспечение работает в каком-то дрянном состоянии.

Со стороны все выглядит хорошо, потому что процесс запущен, но внутри это мозговой мертвец.вилка на нем.Но как я могу это сделать?

Перехват OOME не гарантирует, что будет выполнена следующая строка кода.например, System.exit (9).Так что JVM должна заметить OOME и уничтожить себя.

Есть ли у них какой-то вариант vm для этого?

Ответы [ 3 ]

8 голосов
/ 17 мая 2011

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

, например

 private static byte[] lastResort = new byte[256*1024];
 public static void handleOOME(OutOfMemoryError oome) {
     lastResort = null;
     try {
        LOG.fatal("Dying after ", oome);
     } finally {
        System.exit(-1);
     }
  }
2 голосов
/ 17 мая 2011

Так что JVM должна заметить OOME и уничтожить себя. У них есть какой-то вариант vm для этого?

Нет, нет.

Однако я должен подвергнуть сомнению ваше предположение, что вы не можете поймать OutOfMemoryError и сразу же вызвать System.exit() в обработчике исключений.

На практике это должно работать. Единственная потенциальная проблема - если вы вызвали Runtime.setRunFinalizersOnExit(true) ... и даже это игнорируется, если вы выходите с ненулевым статусом выхода.

(Предупреждение о перехвате OOME и других случайных Error исключений заключается в том, что JVM может быть не в состоянии для продолжения выполнения . Но вызов System.exit(nonzero) не делает этого!)

1 голос
/ 23 декабря 2018

Вы можете использовать -XX:+ExitOnOutOfMemoryError - поддерживается Java 8 с обновлением 92.

Вы также можете использовать -XX:+CrashOnOutOfMemoryError, чтобы получить дамп ядра для дальнейшего исследования.

Вы также можете использовать -XX:+HeapDumpOnOutOfMemoryError для создания дампа кучи в OOME для дальнейшего изучения.

Источник: это и это .

...