Вызываются ли перехватчики завершения работы Java в Heap OOM?
addShutdownHook говорит:
В редких случаях виртуальная машина может прервать работу, то есть перестать работать без корректного завершения работы. Это происходит, когда виртуальная машина завершается извне, например сигналом SIGKILL в Unix или вызовом TerminateProcess в Microsoft Windows. Виртуальная машина также может прервать работу, если собственный метод пойдет не так, например, из-за повреждения внутренних структур данных или попытки доступа к несуществующей памяти. Если виртуальная машина аварийно завершает работу, то нельзя гарантировать, будут ли запущены какие-либо перехватчики выключения.
Когда в куче Java заканчивается память и выдается OutOfMemoryError, приводит ли это к прекращению работы JVM? Приводят ли OOM кучи к неправильной работе собственных методов или повреждению внутренних структур данных? Или ошибки кучи OOM достаточно восстанавливаемы для выполнения перехватчиков выключения?
1 ответ
Когда в куче Java заканчивается память, JVM выдает ошибку OutOfMemoryError и может прервать работу. Будет ли JVM прервана или нет, зависит от того, как OutOfMemoryError обрабатывается приложением. Если ошибка не обнаружена и не обработана приложением, JVM может прервать выполнение.
Важно отметить, что OutOfMemoryError — это исключение во время выполнения, поэтому приложению не требуется явно его перехватывать и обрабатывать. Однако, если приложение поймает и обработает ошибку, оно сможет исправить ситуацию и продолжить работу.
Приводит ли OutOfMemoryError к неправильной работе собственных методов или повреждению внутренних структур данных, зависит от того, как ошибка обрабатывается приложением и самой JVM. В общем, лучше не допускать, чтобы куча исчерпала память, так как это может привести к непредсказуемому поведению.
Если JVM не прерывается, возможно выполнение перехватчиков выключения. Перехватчики завершения работы — это механизм для запуска определенного кода очистки при завершении работы JVM. Однако, если JVM прерывается, перехватчики выключения могут не выполняться.