我有一个简单的Java程序,我想用它来搜索大约2演出的大型xml文件。我正在使用intellij,我无法运行它,因为我保留了内存不足的堆空间错误。
我已经将intellij编译器设置为使用最大内存(我的机器上有4个演出)。
还有其他方法可以让我的工作吗?
答案 0 :(得分:2)
您可能希望使用基于流的方法,例如,使用Stax或Jackson, 这样您就不必立即将整个文档保存在内存中。
答案 1 :(得分:1)
如果使用DOM-style解析器,根据所讨论的XML文件的详细信息,4GB(甚至8GB)可能还不够。例如,在Java字符串中表示时,ASCII字符需要两个字节,并且在创建与各种XML元素对应的对象时会产生相当大的开销。将整个文件作为对象层次结构加载到内存中通常需要比文件大小更多的空间。
如果您只是在XML文档中搜索,则可能不需要随机访问其元素。在这种情况下,SAX等串行访问模型更适合。 Java已包含SAX解析器,如this tutorial from Oracle中所述。
答案 2 :(得分:0)
您可以使用jdk / bin文件夹中的jvisualvm来监视和修改堆内存。
答案 3 :(得分:0)
当您尝试将更多数据添加到内存中的堆空间区域时,将触发“java.lang.OutOfMemoryError:Java堆空间”错误,但此数据的大小大于JVM在Java中可容纳的大小堆空间。
请注意,在JVM启动期间指定了Java应用程序可以使用的内存量(例如,通过-Xmx和-XX:MaxPermSize参数)。在您的情况下,为编译器提供更多内存将无助于运行时 - 尝试增加实际运行时的最大允许堆大小而不是编译器。
通常像添加或增加参数值一样简单,类似于以下内容,其中com.mycompany.MyProgram允许使用最多1G的堆内存:
java -Xmx1024m com.mycompany.MyProgram