将文档添加到文档列表时的Java堆空间

将文档添加到文档列表时的Java堆空间,java,xml,out-of-memory,Java,Xml,Out Of Memory,我正在使用import org.w3c.dom.Document;为了文件 我有一段代码可以解析arraylist文件列表中的xml文件,需要解析的xml文件超过2000个,xml文件的大小约为30-50KB,解析文件没有问题: try { for(int i = 0; i < fileList.size(); i++) { DocumentBuilderFactory factory = DocumentBuilderFactory.new

我正在使用import org.w3c.dom.Document;为了文件

我有一段代码可以解析arraylist文件列表中的xml文件,需要解析的xml文件超过2000个,xml文件的大小约为30-50KB,解析文件没有问题:

    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();
    }
试试看{
对于(int i=0;iDocument doc=builder.parse(fileList.get(i));//取消对docList.add(doc)的注释不会产生此异常,您知道为什么会发生这种情况吗?

很简单:如果不将
doc
引用存储在
docList
中,文档引用将被新对象-
Document doc=builder.parse(fileList.get(i))覆盖;
,因此上一次迭代中的
doc
将是无引用的孤立对象。JVM垃圾收集器将快速删除此对象,因此在循环期间堆上最多有2个doc对象

但是,在
docList.add(doc)
处于活动状态的情况下,您仍然会有对循环中创建的所有doc对象的引用:确切地说是
fileList.size()
实例。它们不会被垃圾收集器收集(并从堆中移除),因为
docList
将有对它们的有效的活动引用


<如何避免<代码> OutOfMeMyRebug < /代码>?在销毁以前DOC的DOM对象之后,只需逐一解析/处理文档,或考虑使用流式解析器,例如“代码> SAXParser < /Cult> .< /P> < P>右击项目文件夹。 单击->运行方式->运行配置->单击参数选项卡->添加

-xmx512M按回车键 -xmx2048M


应用并运行。

为什么每次循环时都要创建新的所有实例?粗略估计,您将需要大约140 MB的RAM。使用:
-Xmx400M
@csmckelvey增加Java堆大小,我只是在试验代码,因为我遇到了这个错误,我在f之外有一个不同的DocumentBuilder我不会基于增加堆大小来制定任何解决方案,除非我真的必须这样做。fileList.size()总是可能更大,所以这没有意义。欢迎来到StackOverflow!这个原始问题没有提及任何特定的IDE,因此在没有更多信息的情况下,这个建议无法付诸实施。同样,这并没有回答OP的问题,这与异常的原因有关,而不是如何可能缓解它。这篇文章将ely最好在主要帖子下方留下评论,或者干脆删除。