我们有一个应用程序,它会生成新的JVM并代表用户执行代码。有时候应用程序会耗尽内存,并因此表现出非常不同的行为方式。有时它们会抛出OutOfMemoryError,有时会冻结。我们可以通过轻量级后台线程检测到后者,在内存不足时停止发送心跳信号。在这种情况下,我们杀死了JVM,但我们绝不能确定失败接收心跳的真正原因是什么。(也可能是网络问题或分段错误)。
最可靠的方法是什么来可靠地检测JVM中的内存不足状况?
- 理论上,-XX:OnOutOfMemoryError选项很有前途,但由于这个错误而实际上无法使用:https://bugs.openjdk.java.net/browse/JDK-8027434 - 捕获OutOfMemoryError实际上不是一个好的替代方案(例如您永远不知道它发生在哪里),尽管它在许多情况下确实起作用。 - 仍然存在一些情况,即JVM冻结并且不会抛出OutOfMemoryError。我仍然确定内存是这个问题的原因。
是否有任何其他选择或解决方法?垃圾收集设置使JVM终止自身而不是冻结?
编辑:我完全控制分支和分叉JVM以及其中执行的代码,两者都在Linux上运行,如果有帮助,可以使用特定于操作系统的工具。
最可靠的方法是什么来可靠地检测JVM中的内存不足状况?
- 理论上,-XX:OnOutOfMemoryError选项很有前途,但由于这个错误而实际上无法使用:https://bugs.openjdk.java.net/browse/JDK-8027434 - 捕获OutOfMemoryError实际上不是一个好的替代方案(例如您永远不知道它发生在哪里),尽管它在许多情况下确实起作用。 - 仍然存在一些情况,即JVM冻结并且不会抛出OutOfMemoryError。我仍然确定内存是这个问题的原因。
是否有任何其他选择或解决方法?垃圾收集设置使JVM终止自身而不是冻结?
编辑:我完全控制分支和分叉JVM以及其中执行的代码,两者都在Linux上运行,如果有帮助,可以使用特定于操作系统的工具。
setDefaultUncaughtExceptionHandler
了,对吧?理论上,当 OOME 发生时,您可以分配几兆字节并释放它们,以便错误处理程序有更好的存活机会。只是猜测... - maaartinus