2016-02-23 2 views
2

У меня есть очень простой фрагмент кода, который выполняет итерацию по списку объектов базы данных и добавляет определенное свойство в StringBuilder. Теперь результаты иногда превышают 100K, поэтому операции добавления превышают 100KИщете альтернативу высокой производительности StringBuilder

Моя проблема заключается в том, что я не могу сократить количество итераций по мере необходимости. Но Stringbuilder продолжает захватывать кучу пространства. И выбрасывает OutOfMemoryException.

Кто-нибудь сталкивался с такой ситуацией и есть решение этой проблемы или альтернатива StringBuilder.

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

StringBuilder endResult = new StringBuilder(); 
     if (dbObjects != null && !dbObjects.isEmpty()) { 
      for (DBObject dBO : dbObjects) { 
       endResult.append("Starting to write" + dBO.getOutPut() + "content"); 
       endResult.append(dBO.getResults); 
      } 
      output.append("END"); 
     } 

Как я уже сказал, что это вполне возможно, что у меня будет 100000 результаты из БД

+0

Если это бросает в 'OutOfMemoryException', то вы, вероятно, следует пересмотреть свой дизайн. Помните, что после этого вы вернете эту строку, и эта строка будет огромной. Вы должны рассмотреть возможность использования потока или чего-то еще. – Zizouz212

+0

Результаты 100k для меня не очень похожи. Сколько памяти кучи выделяется для Java? 32-битная или 64-разрядная JVM? И сколько памяти в системе? (EDIT: параметр командной строки -Xmx для максимальной памяти, что вы используете) – markspace

+0

@markspace IntX CompilerThreadStackSize = 0 uintx ErgoHeapSizeLimit = 0 uintx HeapSizePerGCThread = 87241520 uintx InitialHeapSize = 268435456 uintx LargePageHeapSizeThreshold = 134217728 uintx MaxHeapSize = 4294967296 IntX ThreadStackSize = 1024 IntX VMThreadStackSize = 1024 ява версия "1.8.0_65" Java (TM) SE Runtime Environment Java HotSpot (TM) 64-разрядного сервера VM (смешанный режим) –

ответ

0

Вы не должны делать что-то вроде этого при использовании StringBuilder:

endResult.append("Starting to write" + dBO.getOutPut() + "content"); 

Данное заявление будет делать конкатенация строк. Используйте append() метод, как:

endResult.append("Starting to write").append(dBO.getOutPut()).append("content"); 
+0

append.append.append еще более страшнее, потому что append внутренне выполняет arrayCopy, и в моем случае, поскольку итерации более 100K каждый append убивает мою память, вызывая ArrayCopy –

+0

@ john.p.doe, для конкатенации также нужна копия массива и 'append() 'лучше, чем конкатенация ... Но в вашем конкретном случае вам действительно нужно использовать« ResultSet », вероятно, и читать только то, что требуется, а не создавать огромную строку ... – Codebender

+0

@Codebender Но я использую только то, что нужно. Добавления, которые вы видите, не содержат ничего, что мне не нужно. –