java.lang.OutOfMemoryError:即使使用-Xms1024M-Xmx2048M,也超出了GC开销限制

java.lang.OutOfMemoryError:即使使用-Xms1024M-Xmx2048M,也超出了GC开销限制,java,eclipse,Java,Eclipse,我遇到了这个问题 Exception in thread “main” java.lang.OutOfMemoryError: GC overhead limit exceeded 我试图修复此错误,因为存在解决方案 运行->运行配置->点击参数->在虚拟机参数中键入 -Xms1024M -Xmx2048M Xms- for minimum limit Xmx- for maximum limit 然后它也显示了相同的错误。我该怎么办 当前我正在解析76GB json文件。记住这件事

我遇到了这个问题

Exception in thread “main” java.lang.OutOfMemoryError: GC overhead limit exceeded 
我试图修复此错误,因为存在解决方案

运行
->
运行配置
->
点击参数
->在
虚拟机参数
中键入

-Xms1024M -Xmx2048M

Xms- for minimum limit

Xmx- for maximum limit
然后它也显示了相同的错误。我该怎么办

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


同意@Gilles Antoine Nys的2GB堆,如果您试图将整个76GB JSON文件加载到内存中,则会给收集器带来巨大的压力

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


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

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


和(当然,如果您使用的是json库)都提供了流式处理功能。

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

您可以使用不同的解决方案对文件进行流式处理:

  • 将文件加载到数据库中,并使用Java代码请求它

  • 使用库来流式处理文件。你可以按照这篇文章的建议:


当我处理Wikipedia转储数据(超过50GB)时,我更改了如下VM参数

运行->运行配置->单击参数->内部VM参数类型

-Xms1g -Xmx8g 

Xms- for minimum limit

Xmx- for maximum limit
它对我有用

-Xms1g -Xmx8g 

Xms- for minimum limit

Xmx- for maximum limit

注意:我有16GB内存。

-Xms1024M
-Xmx2048M表示1G和2G,您尝试加载76G文件。即使使用良好的GC调用,您也不可能提供一些解决此问题的建议吗?请参阅下面的帖子:源文件是否可以进行一些分割?解析库是否可以分块解析而不是加载整个文件?你能为xmxTake care使用更大的内存量吗?如果GC在过热时关闭流:/@Gilles Antoineys True,但我指的不一定是java流API,而是流的一般概念。你也可以使用Jackson库,正如FrederikVH所建议的那样