【发布时间】:2014-01-18 00:22:46
【问题描述】:
我正在使用 import org.w3c.dom.Document;用于文档。
我有这段代码从arraylist fileList解析xml文件,有2000多个xml文件要解析,xml文件的大小约为30-50 Kb,我解析文件没有问题:
try {
for(int i = 0; i < fileList.size(); i++) {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(fileList.get(i)); //<------ error will point here when docList.add(doc) is uncommented.
docList.add(doc);
}
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
但每当我将它们添加到列表中时,就会出现此错误:
线程“主”java.lang.OutOfMemoryError 中的异常:Java 堆空间 在 com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.createChunk(未知来源) 在 com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.ensureCapacity(未知来源) 在 com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.createNode(未知来源) 在 com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl.createDeferredTextNode(未知来源) 在 com.sun.org.apache.xerces.internal.parsers.AbstractDOMParser.characters(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(未知来源) 在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(未知来源) 在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(未知来源) 在 com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(未知来源) 在 com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(未知来源) 在 com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(未知来源) 在 javax.xml.parsers.DocumentBuilder.parse(未知来源) 在 com.test.parser.Parser.getDocs(Parser.java:146) 在 com.test.parser.Parser.main(Parser.java:50)
取消注释 docList.add(doc) 不会产生此异常,知道为什么会发生这种情况吗?
编辑:我在 Run Configurations 中将 -Xmx1024M 添加到 VMArguments 并且它有效。
【问题讨论】:
-
为什么每次循环都创建新的实例?
-
相当粗略的估计表明您将需要大约 140 MB 的 RAM。增加 Java 堆大小:
-Xmx400M。 -
@csmckelvey,我只是在试验代码,因为我得到了这个错误,我在 for 循环之外有一个不同的 DocumentBuilder。
-
我不会基于增加堆大小来制定任何解决方案,除非我真的必须这样做。 fileList.size() 总是可能更大,所以这没有意义。
标签: java xml out-of-memory