gpt4 book ai didi

Java 在产生 OutOfMemory 错误之前等待 20 小时?

转载 作者:行者123 更新时间:2023-11-30 07:06:00 24 4
gpt4 key购买 nike

我有一段混合了 Scala 代码的复杂 Java 代码,它读取输入文件并创建大量数据结构,同时逐行处理,包括输入的所有子字符串的哈希表,最大长度为 10。

我最初使用 -Xmx4g 开关运行代码,代码花了 20 小时 才返回 OOM 错误,并且没有完成文件。

然后我使用 -Xmx32g 运行代码,代码在 8 分钟 内处理了文件中的所有行,然后继续处理读取的数据结构。 8 分钟后,Java 使用的常驻内存约为 21GB。

我的问题是:为什么Java没有在8分钟内返回OOM错误?这 20 个小时都在做什么?

最佳答案

根据您的描述,我敢打赌您遇到的 OutOfMemoryError 被标记为“java.lang.OutOfMemoryError:超出 GC 开销限制”。独立于我的赌注是否正确,情况的描述与下面发生的事情完全匹配:

  • 您将一些数据加载到内存中
  • GC 启动并清理了其中的一些。每次 GC 完成其工作时,它都会暂停应用程序线程。
  • 您加载了更多内容,触发了更多的 GC,但在每次 GC 之后,回收的内存越来越少。
  • 垃圾收集的频率增加了,直到几乎没有真正取得进展
  • JVM 有一个内置的安全网来捕获这些情况 - 只要您在 GC 上花费了 98% 以上的时间并且只能恢复 2% 或更少的堆,“java.lang.OutOfMemoryError:GC 开销超出限制”错误被抛出。

要检测此类情况,您可以打开 GC 日志(例如 -verbose:gc 或 -XX:+PrintGCDetails)并留意暂停时间。

关于Java 在产生 OutOfMemory 错误之前等待 20 小时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26078600/

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