OutofmemoryError при сравнении docx с использованием docx4j

StackOverflow https://stackoverflow.com/questions/7308299

  •  26-10-2019
  •  | 
  •  

Вопрос

В своем приложении я сравниваю два файла 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), чтобы увидеть, что потребляет память, и искать любое необычное поведение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top