Eu costumava pensar que não, mas ontem eu tive que fazer isso. É um aplicativo que usa Akka (uma implementação de sistema de ator para a JVM) para processar tarefas assíncronas. Um dos atores realiza alguma manipulação de PDF e, como a biblioteca é de buggy, ela morre com um de StackOverflowError
vez em quando.
O segundo aspecto é que o Akka está configurado para encerrar todo o sistema de atores se algum erro fatal da JVM (por exemplo, StackOverflowError) for detectado.
O terceiro aspecto é que esse sistema ator é incorporado a um aplicativo da Web (por motivos legados, WTF); portanto, quando o sistema do ator é desligado, o aplicativo da Web não é. O efeito líquido é que, em StackOverflowError
nosso aplicativo de processamento de tarefas, torna-se apenas um aplicativo Web vazio.
Como uma solução rápida, eu tive que capturar o StackOverflowError
ser jogado, para que o pool de threads do sistema de atores não fosse destruído. Isso me levou a pensar que talvez às vezes seja bom capturar esses erros, especialmente em contextos como este? Quando há um pool de threads processando tarefas arbitrárias? Ao contrário de um OutOfMemoryError
, não consigo imaginar como um StackOverflowError
aplicativo pode deixar um estado inconsistente. A pilha é limpa após esse erro, para que o cálculo possa continuar normalmente. Mas talvez esteja perdendo algo importante.
Além disso, note que sou a favor de corrigir o erro em primeiro lugar (na verdade, eu já corrigi um SOE nesse mesmo aplicativo há alguns dias), mas eu realmente não sei quando isso tipo de situação pode surgir.
Por que seria melhor reiniciar o processo da JVM em vez de capturar a StackOverflowError
marca, marcar a tarefa como falhada e continuar com meus negócios?
Existe alguma razão convincente para nunca pegar empresas estatais? Exceto "melhores práticas", que é um termo vago que não me diz nada.
StackOverflowException
s geralmente são devidos a uma cadeia não terminável de chamadas de método - aumentar o espaço da pilha aumentaria o custo da memória de um novo thread sem nenhum benefício.
:-)