Ошибка нехватки памяти при создании огромного XML - PullRequest
1 голос
/ 01 декабря 2009

Причина: java.lang.OutOfMemoryError: пространство кучи Java в java.lang.AbstractStringBuilder.expandCapacity (Неизвестный источник) at java.lang.AbstractStringBuilder.append (Неизвестный источник) at java.lang.StringBuffer.append (Неизвестный источник) at java.io.StringWriter.write (неизвестный источник) в com.ctc.wstx.sw.BufferingXmlWriter.flushBuffer (BufferingXmlWriter.java:1358) на com.ctc.wstx.sw.BufferingXmlWriter.flush (BufferingXmlWriter.java:224) на com.ctc.wstx.sw.BufferingXmlWriter.close (BufferingXmlWriter.java:198) в com.ctc.wstx.sw.BaseStreamWriter._finishDocument (BaseStreamWriter.java:1429) на com.ctc.wstx.sw.BaseStreamWriter.close (BaseStreamWriter.java:264) в org.codehaus.stax2.ri.Stax2EventWriterImpl.close (Stax2EventWriterImpl.java:178) в org.utils.JcoFunctionToXmlTransformer.transform (JcoFunctionToXmlTransformer.java:163

ЦЕЛЬ - преобразовать данные, возвращаемые SAP в форме JcoTable, в XML.
ПРОБЛЕМА - java.lang.OutOfMemoryError: пространство кучи Java.

Когда данные очень большие, в тех случаях, когда количество строк превышает 25 000, появляется вышеуказанная ошибка Мы сталкиваемся с той же проблемой, даже при использовании метода API Jco для преобразования в XML, а также при использовании внешнего пользовательского кода (с использованием API Stax) для чтения узел за узлом и потока в виде XML

Ответы [ 6 ]

9 голосов
/ 01 декабря 2009

Вы можете увеличить предел памяти JVM, сказав:

java -Xmx512m ...

или

java -Xmx1024m ...

или любой другой размер, который вам нужен.

Обратите внимание, что вам может потребоваться пересмотреть ваш алгоритм, например, чтобы сериализовать XML напрямую в OutputStream, а не сначала создавать огромную структуру памяти, а затем сериализовать , что , в OutputStream. (Все зависит от деталей того, что делает код.)

В начале этого года у меня был похожий случай, когда я генерировал XML в StringBuffer, а затем записывал StringBuffer в HTTP-ответ OutputStream. Это работало нормально, пока кто-то не попросил 200 МБ XML! Я быстро изменил код для генерации XML непосредственно в OutputStream, сэкономив не только память, но и процессор.

6 голосов
/ 01 декабря 2009

Если вам нужно проанализировать большие XML-файлы (а добавление в кучу Java не всегда работает), вам нужен анализатор SAX, который позволяет анализировать XML-поток вместо загрузки всего дерева DOM в память.

2 голосов
/ 01 декабря 2009

Вы часто используете подстроки больших строк?

прикрепите с помощью jvisualvm, чтобы увидеть, куда уходит ваша память.

1 голос
/ 01 декабря 2009

Возможно, вы записываете XML-документ в поток, и в этом случае вам не нужно хранить весь XML-документ в памяти, поскольку вы можете записать его в поток при его создании.

1 голос
/ 01 декабря 2009

Java -Xmx512m ...

поможет

1 голос
/ 01 декабря 2009

Вы увеличили параметры виртуальной машины на Java при запуске приложения? Например:

java -Xmx1024m ...

, чтобы дать ему гигабайт пространства кучи.

Если это внутри сервера приложений или веб-контейнера, вы обычно найдете такие опции в файле конфигурации или в скрипте запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...