gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:01:42 26 4
gpt4 key购买 nike

我们有一个应用程序可以生成新的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com