Arv*_*ind 1 java memory-leaks memory-management heap-memory
我正在阅读一个大小为2.6GB的XML文件--JVM的大小为6GB.
但是我仍然得到堆空间内存错误?
我在这做错了什么......
作为参考,我输出JVM的最大内存和可用内存属性 -
最大内存显示为大约5.6GB,但可用内存仅显示为90MB ...为什么只有90MB显示为空闲,尤其是 当我甚至没有开始任何处理时...我刚开始这个程序?
在一般情况下,在Java中结构化文本转换为相应的数据结构时,你需要很多比输入文件的大小更多的空间.除了字符串所需的空间之外,还有许多与使用的各种数据结构相关的开销.
例如,每个String实例都有大约32-40字节的额外开销 - 更不用说每个字符存储在两个字节中,这有效地使ASCII编码的XML的空间要求加倍.
然后在将String存储在结构中时会产生额外的开销.例如,为了String在a中存储实例,Map您将需要大约16-32字节的额外开销,具体取决于实现以及如何度量使用情况.
很有可能6GB仅仅不足以同时存储解析的2.6GB XML文件......
底线:
如果你在内存中加载这么大的XML文件(例如使用DOM解析器),你可能做错了.基于流的解析器(如SAX)应该具有更为适度的要求.
或者考虑将XML文件转换为更有用的文件格式,例如嵌入式数据库 - 甚至是基于服务器的实际数据库.这将允许您处理更大的文档而不会出现问题.