使用docx4j进行docx比较时出现OutOfMemoryError

时间:2011-09-05 12:45:58

标签: java docx4j

在我的应用程序中我正在比较两个docx文件并创建一个html比较文件,当我尝试使用150或170行以下的文件然后没有问题,而我尝试比较像200行或更多的大文件然后那个时候显示

java.lang.OutOfMemoryError: Java heap space error,

任何人都可以帮忙吗?

4 个答案:

答案 0 :(得分:2)

由于您没有使用Docx4jDriver类,因此内存不足,这使得diff级别问题更容易通过首先执行段落级别差异来处理。

像这样使用它:

        Body newerBody = ((Document)newerPackage.getMainDocumentPart().getJaxbElement()).getBody();
        Body olderBody = ((Document)olderPackage.getMainDocumentPart().getJaxbElement()).getBody();

        // 2. Do the differencing
        java.io.StringWriter sw = new java.io.StringWriter();
        Docx4jDriver.diff( XmlUtils.marshaltoW3CDomDocument(newerBody).getDocumentElement(),
                        XmlUtils.marshaltoW3CDomDocument(olderBody).getDocumentElement(),
                           sw);

        // 3. Get the result
        String contentStr = sw.toString();
        System.out.println("Result: \n\n " + contentStr);
        Body newBody = (Body) org.docx4j.XmlUtils
                        .unmarshalString(contentStr);

答案 1 :(得分:0)

您可以使用-Xmx和-Xmx将堆空间设置为VM Arguments

以下是有关Heap Size Tuning或此处Heap size

的详情

答案 2 :(得分:0)

尝试使用命令行参数-Xmx<maximum heap size>-Xms<minimum heap size>增加Java堆大小。

同样在您的代码中,测试您实际上已使用以下内容增加了堆大小:

long heapSize = Runtime.getRuntime().totalMemory();
System.out.println("Heap Size = " + heapSize);

在第117行调用Differencer.diff之前执行此操作。

答案 3 :(得分:0)

尝试分析您的应用程序,而不是做出假设或智能猜测。您可以使用随Jdk一起提供的visualvm或控制台。

此外,你可以使用jmap对你的应用程序进行堆转储,然后使用jhat或eclipse mat(我更喜欢这个,google it)来查看消耗内存的内容并注意任何异常行为。