OutOfMemoryError при выполнении сравнения docx с использованием docx4j - PullRequest
2 голосов
/ 05 сентября 2011

в моем приложении я сравниваю два файла docx и создаю один html файл сравнения, когда я пробовал использовать файл размером менее 150 или 170 строк, тогда проблем не возникает, хотя я пытаюсь сравнивать большие файлы, такие как 200 строк или более что тогда это время показывает

java.lang.OutOfMemoryError: Java heap space error,

Может ли кто-нибудь помочь с этим?

Ответы [ 4 ]

2 голосов
/ 10 сентября 2011

Недостаточно памяти, потому что вы не используете класс 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);
0 голосов
/ 10 сентября 2011

Попробуйте профилировать ваше приложение, а не делать предположения или умные предположения.Вы можете использовать visualvm или консоль, поставляемую с Jdk.

Кроме того, вы можете получить кучу дампа вашего приложения, используя jmap, а затем использовать jhat или eclipse mat (я предпочитаю это, google out), чтобы увидетьчто потребляет память и остерегайтесь любого необычного поведения.

0 голосов
/ 06 сентября 2011

Попробуйте увеличить размер кучи Java, используя аргументы командной строки -Xmx<maximum heap size> и -Xms<minimum heap size>.

Также в своем коде проверьте, что вы на самом деле увеличили размер кучи следующим образом:

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

Сделайте это перед вызовом Differencer.diff на линии 117.

0 голосов
/ 05 сентября 2011

вы можете увеличить пространство кучи с помощью -Xmx и -Xmx в качестве аргументов VM

Подробнее о Настройка размера кучи или здесь Размер кучи

...