[英]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”。
...还有...
您只能将6 GB的2.6 GB XML图像加载为文档。 正如jhordo所建议的,该比率更可能是12比1。这是因为每个字节都变成一个16位字符,并且每个标签,属性和值都变成一个带有至少32个字节开销的字符串。
相反,您应该做的是使用SAX或基于事件的解析器来逐步处理文件。 这样,它将仅保留您需要保留的尽可能多的数据。 如果您可以一次性处理所有内容,则无需保留任何内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.