JVM:内存分配失败后继续运行是否安全?

3
我有一个使用库进行时间和内存消耗步骤的进程,有时会占用过多的内存并在大请求时引发分配失败。在这种情况下,接受失败并继续处理是合理的,因此我的解决方案是将该工具的引用设置为null,并创建一个新的工具以便在后续输入中继续处理。
我的组中其他人对这种策略提出异议,称一旦JVM的内存变得如此紧张以至于分配失败,JVM就处于可疑状态:没有真正的证据,只是FUD。另一方面,我只能归纳地认为我还没有看到不良影响(我还没有看到任何黑天鹅)。
问题:继续使用已经抛出内存分配失败的JVM绝对是不安全和禁止的吗?
2个回答

3
不,它并非完全不安全。虽然如果可以避免的话最好不要使用,因为谁知道在开始无法分配内存后,您的数据结构会处于什么样的不确定状态。
有许多应用程序(特别是Web应用程序)可以很好地处理内存分配失败。但是,它是否安全取决于很大程度上于应用程序。不断更新共享资源的代码将比具有大量任务之间的较大分离度且通常很少有共享资源的Web应用程序更容易退化。
最重要的是,您要认真评估您的应用程序,并对可能遇到的陷阱有一个清晰的了解。另外,在故障后尽快重新启动JVM也非常重要。 ;)

我无法避免这个问题,因为这个库是第三方的,而且我无法修改它。所有相关的数据结构都在那个库中,通过放弃解析器(那个库中的东西)并创建一个新的,实际上是重新设置应用程序的那部分。我的问题可能需要进行编辑以澄清,在这种情况下 JVM 本身的持续可行性如何。 - Chris
嗯,JVM本身应该没问题。这就是它抛出OOME而不是停止的原因。它相信自己能够继续前进。但当然,数据结构可能会处于不确定状态。因此,这就成为一项基于对您的应用程序进行仔细评估的价值判断。 - stevevls
这是我的想法。提供一些参考资料来帮助在学术环境中打击FUD将会很有帮助。谢谢。 - Chris
抱歉...我没有任何立即可以提供的文档。 您可以浏览JLS http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html。值得注意的是,即使是赋值语句也可能导致OOME,如果它需要自动解包并且没有剩余空间。 - stevevls

1
当你的内存耗尽时,其他线程也可能会耗尽内存,并且它们可能无法如此优雅地处理。你可能发现大多数时间都可以继续运行,但最好不要在第一时间就耗尽内存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接