在我的应用程序中我正在比较两个docx文件并创建一个html比较文件,当我尝试使用150或170行以下的文件然后没有问题,而我尝试比较像200行或更多的大文件然后那个时候显示
java.lang.OutOfMemoryError: Java heap space error,
任何人都可以帮忙吗?
答案 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)来查看消耗内存的内容并注意任何异常行为。