我负责的应用程序在应用程序停止前5天将一个OutOfMemoryError写入其中一个日志,以便向任何各种应用程序日志写入任何内容。当没有任何内容写入日志时,应用程序真的死了,因为用户调用了应用程序没有响应。
我现在有点困惑,因为我一直以为JVM在OutOfMemoryError之后完全挂起。日志显示没有其他错误,所以我假设OutOfMemoryError是应用程序停止工作的问题。
所以问题是JVM在遇到OutOfMemoryError时是否可以继续扩展。这是一个基于几个OSGi包的应用程序。
谢谢你,奥利弗
答案 0 :(得分:1)
请查看以下Stackoverflow问题:Can the JVM recover from an OutOfMemoryError without a Restart和Does JVM terminate itself after OutOfMemoryError。他们拥有你所需要的所有描述。
答案 1 :(得分:1)
可以像任何其他错误一样捕获OutOfmemoryError,您可以继续,就好像什么都没发生一样。实际上,很有可能某些东西处于不一致的状态,如果可以的话,最好不要继续。
经常发生的是这个错误没有被捕获,并且像任何未捕获的异常或错误一样导致线程死亡(这样OOME并不特殊)当我关键线程死亡时,它通常会导致部分或全部功能失败线程没有重新启动。
BTW catch(Throwable)可以捕获evry类错误,甚至可以通过Thread.slop()触发ThreadDeath。
同样顺便说一下,如果错误无法捕获,也不会打印出来。它的打印方式是首先捕捉它,然后打印出来。
答案 2 :(得分:0)
在OutOfMemoryError之后,JVM似乎可能继续工作 - 它当然不会关闭。但是经验表明,它经常会出现在一些奇怪的状态,你的应用程序似乎正在运行,但会产生奇怪的错误,或者更糟糕的是 - 错误的结果。
因此,虽然一切看起来都不错,但我强烈建议在OutOfMemoryError之后重新启动JVM。
答案 3 :(得分:0)
一旦出现OutOfMemoryError,您可以像任何其他错误一样捕获它,并尝试处理它。
如果您处理得很好(帮助GC移除重物),它不会使您的应用程序崩溃。