OutofmemoryError при сравнении docx с использованием docx4j
Вопрос
В своем приложении я сравниваю два файла docx и создаю один файл сравнения HTML, когда я попытался с ниже 150 или 170 строк файла, тогда нет проблем, в то время как я пытаюсь сравнить большие файлы, такие как 200 или более того, что тогда это время, показывая
java.lang.OutOfMemoryError: Java heap space error,
Кто -нибудь может помочь в этом?
Решение
У вас заканчивается память, потому что вы не используете класс Docx4jdriver, что делает проблему Diff более подлежащей привлечению, сначала выполняя 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);
Другие советы
Вы можете увеличить пространство кучи с -xmx и -xmx в виде аргументов VM
Здесь больше о Настройка размера кучи или здесь Размер кучи
Попробуйте увеличить размер кучи Java, используя аргументы командной строки -Xmx<maximum heap size>
а также -Xms<minimum heap size>
.
Также в вашем коде проверьте, что вы фактически увеличили размер кучи со следующим:
long heapSize = Runtime.getRuntime().totalMemory();
System.out.println("Heap Size = " + heapSize);
Сделайте это перед вызовом Differencer.diff
на линии 117.
Попробуйте профилировать свое приложение, а не делать предположения или интеллектуальные предположения. Вы можете использовать VisualVM или консоли, которая поставляется с JDK.
Кроме того, вы можете взять свалку кучи вашего приложения, используя JMAP, а затем использовать либо JHAT, либо Eclipse Mat (я предпочитаю это, Google It Out), чтобы увидеть, что потребляет память, и искать любое необычное поведение.