2015-01-08 3 views
2

У меня есть программа, которая пишет, а затем зашифровывает большое количество операторов SQL в файл. Однако иногда пользователь может выбрать большое количество элементов для генерации операторов SQL. Например, в zip-файле SQL может содержаться 4 файла, каждый из которых имеет длину более 1 миллиона символов.Уменьшить использование памяти ToStringBuilder (apache commons)?

В настоящее время генерации SQL зависит от функции:

@Override 
public String toString() { 
    return ToStringBuilder.reflectionToString(this); 
} 

Однако это вызывает огромный всплеск в использовании памяти и результатов в программе разбивая из «java.lang.OutOfMemoryError: Java кучу пространства» ошибка Я попытался увеличить размер кучи, но программа все еще медленна и все еще иногда сбой.

Есть ли способ уменьшить потребление памяти вышеупомянутым методом? Он должен быть весь объект, выводимый как строка (а не только его название). Ниже приводится график загрузки приложения, незанятый на некоторое время, а затем попытка перед запуском. enter image description here

А вот что использует память: enter image description here

+0

Немного информации, чтобы получить обоснованное предположение. Можете ли вы предоставить код для написания файла? – lwi

+0

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

+1

Поскольку «ToStringBuilder» принимает только «StringBuffer», а не поток вывода, кажется, что для его хранения требуется целая строка объектов в памяти до записи в файл. Вы можете изучить другой метод, который позволит вам сбрасывать строку при анализе pojos. –

ответ

0

У меня была такая же ошибка ("java.lang.OutOfMemoryError: Java куча пространства") с:

@Override 
public String toString() { 
    return ToStringBuilder.reflectionToString(this); 
} 

внутри аннотация супер класс.

После того как я прочитал Apache Commons Lang3 documentation, я решил эту проблему с помощью функции, которая не использует отражения и, как говорят, быстрее:

@Override 
public String toString() { 
    return new ToStringBuilder(this).append("id",id).toString(); 
} 

где id, очевидно, поле в моем суперкласса, что я хочу вывод.

Это решает проблему переполнения кучи, и мое приложение работает намного быстрее.

Единственным недостатком является то, что вывод toString намного проще, но в любом случае это используется только для отладки, поэтому это не имеет большого значения.

+0

спасибо, это сработало для меня – George

+0

@jnd Рассмотрите вопрос об ответе на этот ответ как «Принято», если этот ответ вам помог. Благодаря! –