@jDekx

Как избежать долгих пауз GC при создании множества мелких объектов?

Добрый день.

Имеется сервер, который выполняет вычисления поиска пути. Для каждого вычисления создается локальная HashMap, в которую записываются мелкие объекты Node (порядка 50 байт на Node и 50 байт на Position, который является полем Node).

Сервер запускается с параметрами
-Xmx12g
-Xms1g
-server
-XX:+UseParallelGC


При этом серверу, судя по VisualVM памяти хватает, но паузы GC приводят к зависанию, если я правильно понимаю.

5d26cfc0ad720914702491.png
5d26cfcc941eb267968444.png
5d26cfd8d1d5f315853163.png

Что я делаю не так, и как можно избежать столь долгих пауз?
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
@jDekx Автор вопроса
Все починилось. Допущенная ошибка в коде, в процессе рефакторинга, которую не покрывали тесты. Основной поток стал обрабатывать слишком много узлов, игнорируя проверку на максимально-допустимое количетсво. Это привело к сильному росту потребления памяти, при этом другие потоки успешно выполняли свою работу и GC подчищал память за ними. Это меня запутало, т.к. судя по графику память иногда, да очищалась.

Просмотрел количество объектов Node и очередей, в которых они хранятся, выяснилось, что на одну очередь приходится порядка 10'000'000 Node, это значение сильно больше максимально-допустимого. После исправления ошибки, основной поток стал корректно выполнять свою задачу, рост памяти и вызов GC перестали быть проблемой.

График памяти после решения проблемы:
5d2737b3ee32f630572455.png
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
RiseOfDeath
@RiseOfDeath
Диванный эксперт.
Как вариант - избегать освобождения и выделения памяти. Особенно частого и в больших количествах.

Очевидно что ноды будут изменяться только если изменяется сам уровень (ну или перемещаются какие-то объекты, которые влияют на проходимость карты) и очевидно это будут небольшие (относительно общего кол-ва нод) изменения, соответственно вы можете иметь глобальный пул нод и в локальной хешмапе использовать ссылки на нужные вам ноды. Как результат - ваши ноды быстро перестанут быть молодыми объектами и GC не будет их проверять (или будет, но редко. Этот момент я не очень понял из оракловской доки)

Еще есть вариант - использовать другой сборщик. Дока

И еще на хабре советуют увеличить размер PermanentGeneration
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽