在我的应用程序中,我正在比较两个 docx 文件并创建一个 html 比较文件,当我尝试使用低于 150 或 170 行的文件时,没有问题,而我尝试比较 200 行或更多的大文件,然后它显示的时间
java.lang.OutOfMemoryError: Java heap space error,
有人可以帮忙吗?
您的内存不足是因为您没有使用 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);
尝试使用命令行参数-Xmx<maximum heap size>
和-Xms<minimum heap size>
.
同样在您的代码中,测试您是否确实增加了堆大小,如下所示:
long heapSize = Runtime.getRuntime().totalMemory();
System.out.println("Heap Size = " + heapSize);
在调用Differencer.diff
第 117 行之前执行此操作。
尝试分析您的应用程序,而不是做出假设或智能猜测。您可以使用 Jdk 附带的 visualvm 或控制台。
此外,您可以使用 jmap 对您的应用程序进行堆转储,然后使用 jhat 或 eclipse mat(我更喜欢这个,用谷歌搜索)来查看消耗内存的内容并注意任何异常行为。