【问题标题】:java.lang.OutOfMemoryError: GC overhead limit exceeded evenif if with -Xms1024M -Xmx2048Mjava.lang.OutOfMemoryError:即使使用 -Xms1024M -Xmx2048M,也会超出 GC 开销限制
【发布时间】:2018-10-27 12:26:38
【问题描述】:

我遇到了问题

Exception in thread “main” java.lang.OutOfMemoryError: GC overhead limit exceeded 

我尝试修复此错误,因为存在解决方案here

Run->Run Configurations->Click on arguments->在VM arguments里面输入

-Xms1024M -Xmx2048M

Xms- for minimum limit

Xmx- for maximum limit

然后它也显示相同的错误。我该怎么办?

当前我正在解析 76GB json 文件。记住这件事

【问题讨论】:

  • -Xms1024M -Xmx2048M 表示 1G 和 2G,您尝试加载 76G 文件。即使有良好的 GC 调用,imo 也不可能
  • 你能提供一些解决这个问题的建议吗?
  • 源文件可以有的怎么分割?解析库可以分块解析而不是加载整个文件吗?您可以为 xmx 使用(更多)更大的内存吗

标签: java eclipse


【解决方案1】:

当我处理 Wikipedia 转储数据(超过 50GB)时,我已经更改了这样的 VM 参数

运行->运行配置->点击参数->在虚拟机参数类型内

-Xms1g -Xmx8g 

Xms- for minimum limit

Xmx- for maximum limit

它对我有用

注意:我有 16GB RAM。

【讨论】:

    【解决方案2】:

    如果在 Java 中处理文件时不流式传输文件,您将永远无法处理 76GB 的数据。

    您可以使用不同的解决方案流式传输您的文件:

    【讨论】:

    • 你也可以使用 Jackson 库,正如 FrederikVH 所建议的那样
    【解决方案3】:

    我们必须查看您为解析文件而编写的代码,但这种错误通常是由于尝试一次读取整个文件而不是使用流式方法造成的。

    JacksonGson(当然,如果您使用的是 json 库)都提供流式传输功能。

    【讨论】:

    • 注意 GC 在开销时关闭 Stream :/
    • @Gilles-AntoineNys 没错,但我不一定指的是 java 流 API,而是流的一般概念。
    【解决方案4】:

    同意@Gilles-Antoine Nys 如果您尝试将整个 76GB JSON 文件加载到内存中,那么使用 2GB 堆会给收集器带来巨大压力。

    请记住,如果源文件为 76GB,则由于创建对象来表示每个节点等的开销以及与解析库关联的元数据,Java 堆上的内存表示可能会大得多。

    如果您不是一次加载整个文件而是进行解析,您可能会更幸运,但我认为这在很大程度上取决于您的底层 JSON 解析库的工作方式。

    【讨论】:

      猜你喜欢
      • 2017-12-27
      • 2016-08-07
      • 2020-09-08
      • 2020-07-24
      • 1970-01-01
      • 2019-06-29
      • 2015-04-25
      • 1970-01-01
      相关资源
      最近更新 更多