我们有一个应用程序,它生成新的JVM并代表我们的用户执行代码。有时那些内存不足,在这种情况下,行为方式非常不同。有时他们会抛出OutOfMemoryError,有时会冻结。我可以通过一个非常轻量级的后台线程检测后者,在内存不足时发送心跳信号。在这种情况下,我们杀死了JVM,但我们永远无法确定无法接收心跳的真正原因。 (这可能是网络问题或分段错误。)处理Java内存不足情况的最佳方法是什么?
什么是可靠地检测JVM内存不足情况的最佳方法?
从理论上讲,-XX:OnOutOfMemoryError选项看起来很有希望,但它的使用效率,由于这个错误:https://bugs.openjdk.java.net/browse/JDK-8027434
捕获OutOfMemoryError而实际上不是众所周知的原因一个很好的选择(例如你永远不知道它发生在哪里),尽管它在很多情况下都有效。
剩下的情况是那些JVM冻结并且不会抛出OutOfMemoryError的情况。我仍然确定内存是这个问题的原因。
是否有任何替代方案或解决方法?垃圾收集设置使JVM自行终止而不是冻结?
编辑:我完全控制分叉和分叉的JVM以及在那些内部执行的代码,两者都在Linux上运行,并且如果有帮助的话,可以使用特定于操作系统的实用程序。
这听起来像你真正感兴趣的是检测何时在另一个进程*中发生了内存不足的情况;一个关键点甚至没有被你的问题的标题暗示。 – supercat 2014-10-08 17:39:23
谢谢。我试图在帖子中说得更清楚,但迄今为止我还没有改变标题,因为我所能提出的所有替代标题都是误导性的。特别是我不介意我们是从JVM内部还是从调用的JVM中获取信息,将其视为具有特定行为的JVM,或者将其视为一个流程。 – 2014-10-08 18:02:13
如果你没有提高你的头衔,许多可能会回答的人甚至不可能打开你的帖子。也许“如果Java VM进程内存不足会触发警报”会是一个更好的标题? – supercat 2014-10-08 18:08:13