У меня есть критический процесс, работающий в Java (1.6), с зарегистрированным хуком завершения работы.В некоторых случаях, когда у меня возникает проблема с OOM (подробнее об этом ниже), процесс внезапно останавливается, я не получаю никаких журналов, мой перехват (Throable x) не перехватывает исключение.
Но крюк отключения работает.Поэтому, если бы был способ узнать, что процесс будет остановлен из-за какого-то неприятного OOM, я мог бы записать необходимую информацию перед выходом.
Есть ли способ сделать это?
О OOM : Не уверен, что является исключением, потому что, как я сказал, оно не попадает.Я знаю, что это OOM, потому что я запускаю процесс с
-XX:+HeapDumpOnOutOfMemoryError
и получаю файл дампа кучи.В других случаях возникает исключение, и это ava.lang.OutOfMemoryError: превышен лимит накладных расходов GC.Но не уверен, что это всегда так.
РЕДАКТИРОВАТЬ:
На случай, если неясно: Я не пытаюсь предотвратить ООМ, как это может произойтипо уважительным причинам в каком-то сценарии, я просто хочу убедиться, что это ясно в файлах журнала приложения
Мой вопрос : возможно ли узнать, что процесс выключаетсяиз-за OOM во время завершения работы?
Мне нужно сделать это программно и из того же процесса .
На данный момент лучший подход - это посмотреть, существует ли файл дампа кучи java_pid_pid из process_.hprof (я знаю pid) с недавней датой и вывести, что был OOM.Я думаю, я мог бы попробовать Runtime.getRuntime (). FreeMemory () и сообщить о проблеме, если доступная память очень мала, но не уверен, насколько это надежно, возможно, когда процесс завершает работу, он уже освободил много памяти, подходвыше, я думаю, лучше всего.