LINUX.ORG.RU

Зависание при создании большого числа объектов

 ,


1

2

Здравствуйте. В Java недолго и столкнулся с некоторыми моментами. Задача подразумевает создание большого числа экземпляров определенного класса, имеющего в качестве одного из полей массив целочисленных данных. Создание объектов реализуется при помощи глубокого клонирования из аналогичного объекта и установкой новых его свойств. Наблюдается зависание при количестве объектов уже > 20176803. Процессор - на 100% и никакого движения. Это нормально?

небось объектами являются умные пикселы

anonymous
()

сделай heap dump и посомотри что у тебя там за проблемы в visualvm Сюда!

rusich
()

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

vertexua ★★★★★
()
Ответ на: комментарий от megajack

ты эти 20 миллионов объектов хранишь или таки выбрасываешь после использования? если первое, то действительно нужно либо больше памяти, либо начать её экономить
если второе, то нужно понимать, что сборщик мусора в джаве работает поколениями, и наилучший результат получается, если как можно меньше объектов перетекают из молодого поколения в старое, т.е. нужно как минимум ещё выставлять параметр Xmn. А ещё в джаве несколько сборщиков мусора и при запуске можно выбирать, который из них надо использовать.

maloi ★★★★★
()
Ответ на: комментарий от megajack

Вообще на 1 гигабайте памяти проблем с GC паузами обычно вроде нет. Пляски вокруг них начинаются когда куча хотя бы 10 ГБ.

maloi ★★★★★
()
Ответ на: комментарий от maloi

Да. Необходимо их хранить все время работы и они должны быть все доступны. Спасибо. Буду дальше думать...

megajack
() автор топика
Ответ на: комментарий от megajack

ну тогда либо больше памяти добавить, либо начать внедрять какие-нибудь flyweight-ы для экономии памяти.
Хотя маловероятно, что на 1 ГБ тебе её хватит - даже на простой массив со 20 миллионами объектов нужно 80 МБ памяти, и это без учета размера самих объектов.

Есть ещё вариант, что ты объекты хранишь в каком-нибудь ArrayList/HashMap, который в определенный момент хочет увеличить свой размер в 1.5-2 раза (т.е. ему нужен непрерывный кусок памяти в сотню мегабайт), что приводит к вызову full GC. В таком случае может помочь заранее задать его размер (если ты знаешь сколько будет объектов и они должны влезать в память).

maloi ★★★★★
()
Ответ на: комментарий от megajack

GC как раз чувствителен не к количеству мертвых, а к количеству живых объектов (у тебя граф большой): http://www.dynatrace.com/en/javabook/how-garbage-collection-works.html. Прицепись профайлером или посмотри дамп с помощью MAT (https://eclipse.org/mat/). Но очевидно, что раз ты там постоянно клонируешь инты и все это происходит в young space, то мелкий сборщик дергается не по теме. Посмотри еще на опции, которые определяют, по какому проценту занимаемого участка хипа триггерится GC.

Да, когда будешь профайлером цепляться, будет еще тормознее - это ожидаемо.

cdshines ★★★★★
()

Спасибо всем! Точно! Там используется все время заполняющаяся мапа и я точно могу сказать каких размеров она должна быть в итоге. Копаю дальше...

megajack
() автор топика
Ответ на: комментарий от megajack

Тогда, если есть возможность разместить это дело в direct NIO-буфере в виде мешанины из байт и эффективно работать с данными в такой форме, GC не будет вмешиваться.

Zenom ★★★
()
Ответ на: комментарий от cdshines

HashMap в Java выделяет для себя память с запасом - по дефолту когда таблица заполняется на 75%, создаётся новая в два раза больше и ссылки на данные копируются туда. В итоге если памяти в притык, то может быть ой.

migesok
()

Ясно. Спасибо. Да, виноват GC. Программа страшно «висючая», такое громадное число объектов создается и используется все время работы программы и никуда не деться... Еще там есть графы, алгоритмы на них (имел проблемы с java.lang.StackOverflowError, -Xss спас.). Добился приемлемого результата настройкой параметров и небольшой модификацией кода (теперь срабатывание FullGC не доставляет такой боли). Вот такая жава... Всем спасибо.

megajack
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.