Как избежать нехватки памяти в StringBuilder или String в Java - PullRequest
0 голосов
/ 21 февраля 2011

Я получаю много данных от веб-службы, содержащей ссылки на сущности xml. При замене соответствующих символов я получаю сообщение об ошибке нехватки памяти. Кто-нибудь может привести пример, как этого избежать? Я два дня застрял на этой проблеме.

Это мой код:

public  String decodeXMLData(String s)
 {
     s = s.replaceAll(">",">");
     System.out.println("string value is"+s);

     s = s.replaceAll("&lt;", "<"); 
     System.out.println("string value1 is"+s);
     s = s.replaceAll("&amp;", "&");

     s = s.replaceAll("&quot;", "\"");

      s = s.replaceAll("&apos;", "'");

      s = s.replaceAll("&nbsp;", " ");

     return s;
 } 

Ответы [ 5 ]

4 голосов
/ 21 февраля 2011

Вы должны использовать SAX-анализатор, а не анализировать его самостоятельно.

Просто посмотрите на эти ресурсы, они тоже имеют примеры кода:

2 голосов
/ 21 февраля 2011
1 голос
/ 21 февраля 2011

Вызывая пять раз replaceAll, вы создаете пять новых объектов String.В общей сложности вы работаете с шестью струнами.Это не эффективный способ XML-декодирования строки.

Я рекомендую использовать более надежную реализацию методов XML-кодирования / декодирования, например, содержащихся в библиотеках Commons Lang .В частности, StringEscapeUtils может помочь вам выполнить свою работу.

0 голосов
/ 21 февраля 2011

Вы можете попытаться увеличить память JVM, но это задержит неизбежное, если проблема серьезная (например, если вы пытаетесь потребовать гигабайты, например).

Если у вас есть одна строкаэто приводит к тому, что вам не хватает памяти, пытаясь это сделать, это должно быть огромно :) Предложение использовать синтаксический анализатор SAX, чтобы обрабатывать его и распечатывать его по частям, является хорошим.Или разбейте его на более мелкие части и отправьте каждый из них в процедуру, которая делает то, что вы хотите, и затем отбросьте результат.

0 голосов
/ 21 февраля 2011

Показанный метод не будет источником ошибок нехватки памяти (если только обрабатываемая вами строка не будет такой же большой, как оставшаяся свободная куча).

То, с чем вы можете столкнуться, это тот факт, что вызовы String.substring() не выделяют новую строку, но создают строковый объект, который повторно использует тот, на котором вызывается подстрока. Если ваш код существует для чтения больших буферов и создания строк из этих буферов, вам может потребоваться использовать new String(str.substring(index)) для принудительного перераспределения строковых значений в новые небольшие массивы символов.

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