Раньше я думал, что это не так, но вчера я должен был это сделать. Это приложение, которое использует Akka (реализация системы акторов для JVM) для обработки асинхронных заданий. Один из актеров выполняет некоторые манипуляции с PDF, и поскольку библиотека глючит, время от времени она умирает StackOverflowError
.
Второй аспект заключается в том, что Akka настроен на отключение всей системы акторов в случае обнаружения фатальной ошибки JVM (например, StackOverflowError).
Третий аспект заключается в том, что эта система акторов встроена в веб-приложение (по причинам WTF, унаследованным и другим причинам), поэтому, когда система акторов закрыта, веб-приложение не отключается. Чистый эффект заключается в том, что StackOverflowError
наше приложение для обработки заданий становится просто пустым веб-приложением.
В качестве быстрого решения я должен был поймать StackOverflowError
брошенное, чтобы пул потоков системы акторов не был разрушен. Это привело меня к мысли, что, может быть, иногда можно ловить такие ошибки, особенно в подобных ситуациях? Когда существует пул потоков, обрабатывающий произвольные задачи? В отличие от OutOfMemoryError
я не могу представить, как StackOverflowError
можно оставить приложение в несогласованном состоянии. После такой ошибки стек очищается, поэтому вычисления могут продолжаться нормально. Но, возможно, я упускаю что-то важное.
Кроме того, позвольте мне отметить, что я прежде всего за исправление ошибки (на самом деле я уже исправил SOE в этом же приложении несколько дней назад), но я действительно не знаю, когда это Такая ситуация может возникнуть.
Почему было бы лучше перезапустить процесс JVM, а не перехватывать StackOverflowError
, помечать эту работу как невыполненную и продолжать свою работу?
Есть ли веская причина никогда не ловить ГП? За исключением «лучших практик», это неопределенный термин, который мне ничего не говорит.
StackOverflowException
s обычно происходят из-за неразрывной цепочки вызовов методов - увеличение места в стеке увеличит стоимость памяти нового потока без какой-либо выгоды.
:-)