从内存中获取堆空间错误-如何使用java堆内存
我正在阅读一个大小为-2.6GB的XML文件——JVM的大小是6GB 然而,我仍然得到一个堆空间内存不足的错误 我在这里做错了什么 作为参考,我输出JVM的最大内存和可用内存属性--从内存中获取堆空间错误-如何使用java堆内存,java,memory-management,memory-leaks,heap-memory,Java,Memory Management,Memory Leaks,Heap Memory,我正在阅读一个大小为-2.6GB的XML文件——JVM的大小是6GB 然而,我仍然得到一个堆空间内存不足的错误 我在这里做错了什么 作为参考,我输出JVM的最大内存和可用内存属性-- 最大内存显示为约5.6GB,但可用内存显示为仅90MB。。。为什么只有90MB显示为免费,尤其是当我还没有开始任何处理。。。我刚刚启动了这个程序?一般来说,在Java中将结构化文本转换为相应的数据结构时,需要比输入文件大得多的空间。除了字符串所需的空间之外,所使用的各种数据结构还有很多开销 例如,每个String实
最大内存显示为约5.6GB,但可用内存显示为仅90MB。。。为什么只有90MB显示为免费,尤其是当我还没有开始任何处理。。。我刚刚启动了这个程序?一般来说,在Java中将结构化文本转换为相应的数据结构时,需要比输入文件大得多的空间。除了字符串所需的空间之外,所使用的各种数据结构还有很多开销 例如,每个
String
实例的额外开销约为32-40字节,更不用说每个字符存储在两个字节中,这实际上使ASCII编码XML的空间需求翻了一番
然后,在结构中存储字符串时会有额外的开销。例如,为了将字符串
实例存储在映射
中,您将需要大约16-32字节的额外开销,具体取决于实现和使用情况的衡量方式
很可能6GB不足以一次存储解析后的2.6GB XML文件 底线: 如果在内存中加载如此大的XML文件(例如,使用DOM解析器),则可能是做错了什么。基于流的解析器(如SAX)的需求应该要小得多
P>可选地考虑将XML文件转换为更有用的文件格式,例如嵌入式数据库,甚至是基于服务器的实际数据库。这将允许您处理大得多的文档而不会出现问题。通常,在Java中将结构化文本转换为相应的数据结构时,您需要比输入文件大得多的空间。除了字符串所需的空间之外,所使用的各种数据结构还有很多开销 例如,每个
String
实例的额外开销约为32-40字节,更不用说每个字符存储在两个字节中,这实际上使ASCII编码XML的空间需求翻了一番
然后,在结构中存储字符串时会有额外的开销。例如,为了将字符串
实例存储在映射
中,您将需要大约16-32字节的额外开销,具体取决于实现和使用情况的衡量方式
很可能6GB不足以一次存储解析后的2.6GB XML文件 底线: 如果在内存中加载如此大的XML文件(例如,使用DOM解析器),则可能是做错了什么。基于流的解析器(如SAX)的需求应该要小得多
P>可选地考虑将XML文件转换为更有用的文件格式,例如嵌入式数据库,甚至是基于服务器的实际数据库。这将允许您处理大得多的文档而不会出现问题。您应该避免一次性将整个xml加载到内存中,而是使用能够处理大量xml的专用类。您应该避免一次性将整个xml加载到内存中,而是使用能够处理大量xml的专用类xml。这里可能有几个不同的问题 但首先: 1) 如果您使用的是64位操作系统,请确保您使用的是64位JVM 2) 确保代码尽快关闭所有打开的资源 3) 显式地将对已完成的大型对象的引用设置为“null” 。。。而且 4) 熟悉或:
- 这里可能存在几个不同的问题
但首先:
1) 如果您使用的是64位操作系统,请确保您使用的是64位JVM
2) 确保代码尽快关闭所有打开的资源
3) 显式地将对已完成的大型对象的引用设置为“null”
。。。而且
4) 熟悉或:
相反,您应该使用SAX或基于事件的解析器逐步处理文件。这样,它将只保留您需要保留的数据。如果您可以一次处理所有内容,那么就不需要保留任何内容。您无法将2.6 GB XML图像作为一个只有6 GB的文档加载。正如乔多所言,这一比例更有可能是12比1。这是因为每个字节都会变成一个16位字符,每个标记、属性和值都会变成一个至少有32字节开销的字符串
相反,您应该使用SAX或基于事件的解析器逐步处理文件。这样,它将只保留您需要保留的数据。如果您可以一次处理所有内容,则无需保留任何内容。您使用的是什么操作系统?有些对一个进程可以消耗多少内存有限制。。。我相信32位windows是最大2gb.2.6GB XML-OMG!使用数据库!!由于所有的节点对象、子列表、属性对象等,在内存中存储XML文件将比磁盘上的平面文件占用更多的空间。@jlordo-使用SAX或DOM读取XML文件是一件非常合适的事情。根据需求,数据库实际上可能是最糟糕的解决方案。