繁体   English   中英

堆空间不足而导致内存不足错误-如何使用Java堆内存

[英]getting heap space out of memory error- how is java heap memory used

我正在读取一个大小为2.6GB的XML文件-JVM的大小为6GB。

但是我仍然遇到堆空间不足的错误吗?

我在这里做错了什么...

作为参考,我输出了JVM的最大内存和空闲内存属性-

最大内存显示为大约5.6GB,但是可用内存显示为仅90MB ...为什么只有90MB显示为空闲,尤其是。 当我什至没有开始任何处理时...我刚刚启动了程序?

在一般情况下,在Java中结构化文本转换为相应的数据结构时,你需要比输入文件的大小更多空间。 除了字符串所需的空间之外,与使用的各种数据结构相关的开销也很多。

例如,每个String实例都有大约32-40字节的额外开销-更不用说每个字符存储在两个字节中了,这实际上使ASCII编码XML的空间需求增加了一倍。

这样,在将String存储在结构中时,就会产生额外的开销。 例如,为了将String实例存储在Map您将需要大约16-32字节的额外开销,具体取决于实现方式和衡量使用情况的方式。

6GB可能不足以立即存储已解析的2.6GB XML文件...

底线:

如果要在内存中加载如此大的XML文件(例如,使用DOM解析器),则可能是做错了什么。 基于流的解析器(例如SAX)应具有更为适度的要求。

或者,考虑将XML文件转换为更有用的文件格式,例如嵌入式数据库-甚至是基于服务器的实际数据库。 这样一来,您就可以处理更大的文档而不会出现问题。

您应该避免将整个xml一次加载到内存中,而应使用可以处理大量xml的专门类。

这里可能存在几个不同的问题。

但对于初学者:

1)如果您使用的是64位操作系统,请确保使用的是64位JVM

2)确保您的代码尽快关闭所有打开的资源。

3)明确将对大型对象的引用设置为“ null”。

...还有...

4)熟悉JConsoleVisualVM

您只能将6 GB的2.6 GB XML图像加载为文档。 正如jhordo所建议的,该比率更可能是12比1。这是因为每个字节都变成一个16位字符,并且每个标签,属性和值都变成一个带有至少32个字节开销的字符串。

相反,您应该做的是使用SAX或基于事件的解析器来逐步处理文件。 这样,它将仅保留您需要保留的尽可能多的数据。 如果您可以一次性处理所有内容,则无需保留任何内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM