Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从内存中获取堆空间错误-如何使用java堆内存_Java_Memory Management_Memory Leaks_Heap Memory - Fatal编程技术网

从内存中获取堆空间错误-如何使用java堆内存

从内存中获取堆空间错误-如何使用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实

我正在阅读一个大小为-2.6GB的XML文件——JVM的大小是6GB

然而,我仍然得到一个堆空间内存不足的错误

我在这里做错了什么

作为参考,我输出JVM的最大内存和可用内存属性--


最大内存显示为约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) 熟悉或:


      您不能将2.6 GB的XML图像作为只有6 GB的文档加载。正如乔多所言,这一比例更有可能是12比1。这是因为每个字节都会变成一个16位字符,每个标记、属性和值都会变成一个至少有32字节开销的字符串


      相反,您应该使用SAX或基于事件的解析器逐步处理文件。这样,它将只保留您需要保留的数据。如果您可以一次处理所有内容,那么就不需要保留任何内容。

      您无法将2.6 GB XML图像作为一个只有6 GB的文档加载。正如乔多所言,这一比例更有可能是12比1。这是因为每个字节都会变成一个16位字符,每个标记、属性和值都会变成一个至少有32字节开销的字符串


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

      您使用的是什么操作系统?有些对一个进程可以消耗多少内存有限制。。。我相信32位windows是最大2gb.2.6GB XML-OMG!使用数据库!!由于所有的节点对象、子列表、属性对象等,在内存中存储XML文件将比磁盘上的平面文件占用更多的空间。@jlordo-使用SAX或DOM读取XML文件是一件非常合适的事情。根据需求,数据库实际上可能是最糟糕的解决方案。