java - 在 Java 中处理内存不足情况的最佳方法是什么?

标签 java linux process garbage-collection out-of-memory

我们有一个应用程序可以生成新的 JVM 并代表我们的用户执行代码。有时那些会耗尽内存,在这种情况下会以非常不同的方式表现。有时他们抛出 OutOfMemoryError,有时他们卡住。我可以通过一个非常轻量级的后台线程检测到后者,该线程在内存不足时停止发送心跳信号。在那种情况下,我们会杀死 JVM,但我们永远不能绝对确定未能收到心跳的真正原因是什么。 (也可能是网络问题或段错误。)

在 JVM 中可靠地检测内存不足情况的最佳方法是什么?

  • 理论上,-XX:OnOutOfMemoryError 选项看起来很有前途,但由于这个错误,它实际上无法使用:https://bugs.openjdk.java.net/browse/JDK-8027434

  • 由于众所周知的原因(例如,您永远不知道它发生在哪里),捕获 OutOfMemoryError 实际上并不是一个好的替代方法,尽管它在许多情况下确实有效。

  • 剩下的情况是 JVM 卡住并且没有抛出 OutOfMemoryError 的情况。我仍然确定内存 是此问题的原因。

是否有任何替代方案或解决方法?使 JVM 自行终止而不是卡住的垃圾收集设置?

编辑:我完全控制 fork 和 fork 的 JVM 以及在其中执行的代码,它们都在 Linux 上运行,如果有帮助,可以使用操作系统特定的实用程序。

最佳答案

唯一真正的选择是(不幸的是)尽快终止 JVM。

因为您可能无法更改所有代码来捕获错误并做出响应。如果你不信任 OnOutOfMemoryError(我想知道为什么它不应该使用 Java 8 使用的 vfork,它在 Windows 上工作),你至少可以触发堆转储并在外部监控那些文件:

java .... -XX:+HeapDumpOnOutOfMemoryError "-XX:OnOutOfMemoryError=kill %p"

关于java - 在 Java 中处理内存不足情况的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26256393/

相关文章:

Java XMLBeans 抛出 NoSuchMethod 错误

c++ - 为什么无限递归会导致段错误

在进程和线程之间进行选择,以及进程间(线程)通信

process - Erlang生成过程错误(人工神经网络)

c# - 调试 Process.Start() 的应用程序

java - Facebook4j 帖子跟踪问题

java - 正则表达式用大写和小写字符分割字符串

java - 我应该如何配置 Jetty 7 pre3 以使用 oracle JDBC 源?

linux - 在 Linux 上解码 mmap() 标志

c++ - 如何使用 C++ 执行 gvim 命令