2

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

java.lang.OutOfMemoryError: Java heap space error,

有人可以帮忙吗?

4

4 回答 4

2

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

像这样使用它:

        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);
于 2011-09-10T13:12:14.857 回答
0

您可以使用 -Xmx 和 -Xmx 作为 VM 参数使堆空间更大

这里更多关于堆大小调整或这里堆大小

于 2011-09-05T12:49:36.617 回答
0

尝试使用命令行参数-Xmx<maximum heap size>-Xms<minimum heap size>.

同样在您的代码中,测试您是否确实增加了堆大小,如下所示:

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

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

于 2011-09-06T13:54:50.473 回答
0

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

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

于 2011-09-10T13:25:54.263 回答