我曾经以为不是,但是昨天我不得不这样做。这是一个使用Akka(JVM的参与者系统实现)来处理异步作业的应用程序。其中一位参与者执行了一些PDF操作,并且由于该库存在错误,因此有时会死于StackOverflowError
。
第二个方面是,如果捕获到任何JVM致命错误(例如,StackOverflowError),则将Akka配置为关闭其整个actor系统。
第三个方面是该参与者系统被嵌入到Web应用程序中(出于WTF-ish,传统,原因),因此当参与者系统关闭时,Web应用程序就不会被关闭。最终结果是,在StackOverflowError
我们的工作处理应用程序上,该应用程序变成了一个空的Web应用程序。
作为快速解决方案,我不得不赶上了StackOverflowError
被抛出的问题,以便不会破坏actor系统的线程池。这使我认为也许有时可以捕获此类错误,尤其是在这种情况下?当有一个线程池处理任意任务时?与A不同,OutOfMemoryError
我无法想象A如何StackOverflowError
使应用程序处于不一致状态。在发生此类错误后将清除堆栈,因此计算可以正常进行。但是也许我错过了一些重要的事情。
另外,请注意,我一开始就是要修复错误(事实上,几天前我已经在同一应用程序中修复了SOE),但是我真的不知道什么时候可能会出现这种情况。
为什么最好重新启动JVM进程而不是捕获StackOverflowError
,将作业标记为失败,然后继续我的业务?
有什么令人信服的理由永远不赶上国有企业?除了“最佳实践”,这是一个模糊的术语,什么也没告诉我。
StackOverflowException
s通常是由于方法调用的不间断链-增加堆栈空间会增加新线程的内存成本,而没有任何好处。
:-)