1

我负责的应用程序在应用程序停止向任何各种应用程序日志中写入任何内容前 5 天将 OutOfMemoryError 写入其中一个日志。当不再向日志写入任何内容时,应用程序真的死了,因为用户调用应用程序没有响应。

我现在有点疑惑,因为我一直以为在 OutOfMemoryError 之后 JVM 完全挂了。日志显示没有其他错误,所以我假设 OutOfMemoryError 是应用程序停止工作的问题。

所以问题是当 JVM 遇到 OutOfMemoryError 时,它是否可以继续扩展。它是一个基于多个 OSGi 捆绑包的应用程序。

谢谢你,奥利弗

4

4 回答 4

1

Please look at these Stackoverflow Questions: Can the JVM recover from an OutOfMemoryError without a Restart and Does JVM terminate itself after OutOfMemoryError. They have all the description that you need I feel.

于 2013-09-12T07:34:35.533 回答
1

OutOfmemoryError 可以像任何其他错误一样被捕获,并且您可以继续,就好像什么都没发生一样。实际上,很有可能某些东西处于不一致的状态,如果可以的话,最好不要继续。

经常发生的是这个错误没有被捕获,就像任何未捕获的异常或错误一样,这会导致线程死亡(这样 OOME 并不特殊)当我关键线程死亡时,它通常会导致部分或全部功能失败,因为线程是没有重新启动。

顺便说一句,catch(Throwable) 可以捕获各种错误,甚至是由 Thread.slop() 触发的 ThreadDeath。

另外顺便说一句,如果无法捕获错误,也不会打印它。它的打印方式是先捕获它,然后打印它。

于 2013-09-12T08:35:24.757 回答
0

在 OutOfMemoryError 之后,JVM 似乎会继续工作——它肯定不会关闭。但是经验表明,它通常会以某种奇怪的状态结束,您的应用程序似乎正在运行,但会产生奇怪的错误,或者更糟糕的是 - 错误的结果。

因此,虽然一切看起来都很好,但我强烈建议在 OutOfMemoryError 之后重新启动 JVM。

于 2013-09-12T07:22:58.207 回答
0

一旦发生 OutOfMemoryError ,您可以像任何其他错误一样捕获它,并尝试处理它。

如果你处理得很好(帮助 GC 移除重物),它不会让你的应用崩溃。

于 2013-09-12T07:41:11.450 回答