Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
1 / 1 / 2
Регистрация: 30.09.2013
Сообщений: 89

Java heap space

13.01.2017, 00:34. Показов 2075. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть цикл который прогоняет около миллиона итераций. Каждая итерация сначало получает строку с помощью метода getRow() которая состоит из не менее 5000 символов. Метод возвращает объект StringBuffer(). Затем нужно в каждой строке заменить все true и false на Yes and No соответственно. Примерно после 100_000 итераций цикл достаточно сильно замедляется. Если сначало делает около 1000-1300 итерации в минуту, то потом 100-300. Причем размер строк примерно всегда одинаковый. Подскажите плиз, как можно модифицировать данный код? Я так понимаю что забивается heap, но тогда вопрос, почему не срабатывает GC? Спасибо.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
FileOutputStream file = new FileOutputStream("myFile");
StringBuffer itemRow = null;
for (int k = 0; k < 1_000_000; k++) {
                        itemRow.append(getRow());
                        while (itemRow.toString().contains(TRUE)) {
                            itemRow = new StringBuffer(itemRow.toString().replaceAll(TRUE, YES));
                        }
                        while (itemRow.toString().contains(FALSE)) {
                            itemRow = new StringBuffer(itemRow.toString().replaceAll(FALSE, NO));
                        }
                        file.write(itemRow.toString().getBytes());
                        itemRow = new StringBuffer();
                    }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.01.2017, 00:34
Ответы с готовыми решениями:

Поймал OutOfMemoryError: Java heap space
Вылазит вот такая ошибка. Помогите разобраться почему? public List&lt;String&gt; delimiter(String str,char delim){ List&lt;String&gt;...

Ошибка Java Head Space
Доброе время суток. Подскажите пожалуйста, приложение выдает ошибку Java Head Space, в детализации написано &quot;outofmemoryerror: java...

Память Heap и Stack
Здравствуйте , подскажите пожалуйста такой вопрос . Вот есть есть три области памяти Heap,Stack ,PermGen . Вопрос вот в чем . Мы создаем...

6
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
13.01.2017, 01:14
Лучший ответ Сообщение было отмечено dispetch как решение

Решение

зачем стрингБуффер?
Цитата Сообщение от dispetch Посмотреть сообщение
while (itemRow.toString().contains(TRUE)) {
* * * * * * * * * * * * * * itemRow = new StringBuffer(itemRow.toString().replaceA ll(TRUE, YES));
* * * * * * * * * * * * }
какая-то странная конструкция? ты уверен, что вот это все тут нужно?
Цитата Сообщение от dispetch Посмотреть сообщение
while (itemRow.toString().contains(TRUE)) {
* * * * * * * * * * * * * * itemRow = new StringBuffer(itemRow.toString().replaceA ll(TRUE, YES));
* * * * * * * * * * * * }
* * * * * * * * * * * * while (itemRow.toString().contains(FALSE)) {
* * * * * * * * * * * * * * itemRow = new StringBuffer(itemRow.toString().replaceA ll(FALSE, NO));
* * * * * * * * * * * * }
Почему бы вот эту всю хрень не заменить на
Java
1
2
3
String s = itemRow.toString();
s.replaceAll(TRUE, YES);
s.replaceAll(FALSE, NO);
ну и не понятно, что у тебя в getRow();
1
1 / 1 / 2
Регистрация: 30.09.2013
Сообщений: 89
13.01.2017, 10:07  [ТС]
Цитата Сообщение от xoraxax Посмотреть сообщение
зачем стрингБуффер?
Сообщение от dispetch
while (itemRow.toString().contains(TRUE)) {
* * * * * * * * * * * * * * itemRow = new StringBuffer(itemRow.toString().replaceA ll(TRUE, YES));
* * * * * * * * * * * * }
какая-то странная конструкция? ты уверен, что вот это все тут нужно?
Сообщение от dispetch
while (itemRow.toString().contains(TRUE)) {
* * * * * * * * * * * * * * itemRow = new StringBuffer(itemRow.toString().replaceA ll(TRUE, YES));
* * * * * * * * * * * * }
* * * * * * * * * * * * while (itemRow.toString().contains(FALSE)) {
* * * * * * * * * * * * * * itemRow = new StringBuffer(itemRow.toString().replaceA ll(FALSE, NO));
* * * * * * * * * * * * }
Почему бы вот эту всю хрень не заменить на
JavaВыделить код
1
2
3
String s = itemRow.toString();
s.replaceAll(TRUE, YES);
s.replaceAll(FALSE, NO);
ну и не понятно, что у тебя в getRow();
Насчет StringBuffer, читал что они быстрее работают чем обычная конкатенация, поэтому решил попробовать.
Но предложение заменить на String принял во внимание, сейчас попробую, спасибо.

Метод getRow(), там тоже достаточно сложная логика по получению строки. Чуть позже выложу...
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
13.01.2017, 12:22
dispetch, опишите ваше задание. Код кривой и в нем ничего непонятно.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,779
13.01.2017, 20:41
Цитата Сообщение от dispetch Посмотреть сообщение
Насчет StringBuffer, читал что они быстрее работают чем обычная конкатенация, поэтому решил попробовать.
1) У тебя нигде нет конкатенации, ты каждый раз создаёшь новый StringBuffer.
2) Почему ты не стал читать дальше и не прочитал, про StringBuilder?

xoraxax тебе правильно написал, вся твоя портянка переписывается в пару-другую коротких строк. Правда, он забыл, что строки иммутабельны. =)

Java
1
2
3
4
5
        try (FileOutputStream file = new FileOutputStream("myFile")) {
            for (int k = 0; k < 1_000_000; k++) {
                file.write(getRow().replaceAll(TRUE, YES).replaceAll(FALSE, NO).getBytes());
            }
        }
0
1 / 1 / 2
Регистрация: 30.09.2013
Сообщений: 89
14.01.2017, 22:15  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
опишите ваше задание. Код кривой и в нем ничего непонятно.
задание состоит в том чтобы данные из БД запихнуть в Excel файлик. Причем данных этих достаточно много. Использую Апачеввскую библиотеку POI. Впринципе, сделал так, как предложил товарищ xoraxax, падать перестало в этом месте при большом количестве продуктов, за что ему благодарен.

Добавлено через 9 минут
Цитата Сообщение от korvin_ Посмотреть сообщение
1) У тебя нигде нет конкатенации, ты каждый раз создаёшь новый StringBuffer.
2) Почему ты не стал читать дальше и не прочитал, про StringBuilder?
StringBuffer не только из-за производительности ставил, а и потоков сначало было тоже несколько. При многопоточности StringBuffer лучше, т.к. синхронизирован.
Цитата Сообщение от korvin_ Посмотреть сообщение
xoraxax тебе правильно написал, вся твоя портянка переписывается в пару-другую коротких строк. Правда, он забыл, что строки иммутабельны. =)
Дело в том что циклы while мне нужны обязательно. Т.к. в строке, в которой идет реплейс TRUE == ";true;" и FALSE == ";false;". Причем строка может быть типо "...;true;true;true;..." и в таком случае, если один раз сделать replaceAll(TRUE, "Yes"), то получится сттрока "...;Yes;true;Yes;..."
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
15.01.2017, 00:56
Цитата Сообщение от dispetch Посмотреть сообщение
задание состоит в том чтобы данные из БД запихнуть в Excel файлик.
когда данных из БД много, нужно использовать пагинацию а не грузить сначала все в память а потом в файл.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.01.2017, 00:56
Помогаю со студенческими работами здесь

OutOfMEmoryError PerGen space
Здравствуйте. Такая проблема. Есть код public class PermGenSpace { public static void main(String args) { for (int i = 0; i...

Увеличение размера heap в JVM
Не получается увеличить размер хипа. Уже и в командной строке прописывал -Xmx1024m, и в idea.exe.vmoptions, и в Панель...

Insufficient space for shared memory file
Ставлю Jira на удаленный сервер и получаю такое сообщение сразу после запуска бинарника: Java HotSpot(TM) 64-Bit Server VM warning:...

Как бороться с java.lang.OutOfMemoryError: Java heap space
Доброго времени суток. На Java пишу программу, требующую большого количества информации (распознавалку изображений) Нужно хранить...

Переполнение кучи java.lang.OutOfMemoryError: Java heap space
Доброго времени суток! Помогите настроить jvm. Многое уже перепробовал. Задача в том, чтобы выгрузить из БД Oracle blob-поля, в которых...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru