powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Нагрузить gc, интереса ради, а не дела для.
16 сообщений из 16, страница 1 из 1
Нагрузить gc, интереса ради, а не дела для.
    #38298402
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Периодически попадаются статьи, в которых пишут что-то вроде "у нас stop-at-word gc повесил систему на пять минут" (hotspot server vm). Я вот сколько раз пытался написать прогу, которая специально создаст "тяжелые" для gc условия - не выходило.

вопрос вот в чем - с 512мб хипа по умолчанию это вообще реально? Ну, пускай не на 5 минут подвесить, но секунд хотя б на 10. Или нужны сотни гигабайт?

То есть задача состоит в том, чтобы сделать что-либо, чтобы одно new вызвало stop-at-word и секунд хотя бы 10 все висело.
...
Рейтинг: 0 / 0
Нагрузить gc, интереса ради, а не дела для.
    #38298807
iMove
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok ,
Практической ценности в этом действительно нет. Вообще никакой.

А попробовать можете следующее:
1) Забиваете хип кучей связанных друг с другом объектов, которые видны только из одного объекта.
2) Выжидаете несколько minor GC, что бы эти объекты ушли в tenured.
2) Убиваете этот объект.
3) С параллельного треда постоянно что-то отпечатываете в консоль.

Идея заключается в том, что бы в хипе одномоментно оказывается много orphaned объектов, с большим количеством связей. По идее, в параллельном "печатающем" треде вы, может быть, сможете заметить stop-the-world во время мажорной сборки.
Ну и плюс поиграться с настройками GC - с размером tenured, алгоритмом сборки, трешолды какие-нибудь выставить.
...
Рейтинг: 0 / 0
Нагрузить gc, интереса ради, а не дела для.
    #38298835
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok,

Включаем serial collector. 512Мб - мало. Сурьезные проблемы обычно начинаются с кучами за 4Гб. Настраиваем Eden на минимум, tenured на максимум. И забиваем до отказа.
...
Рейтинг: 0 / 0
Нагрузить gc, интереса ради, а не дела для.
    #38298836
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iMove1) Забиваете хип кучей связанных друг с другом объектов, которые видны только из одного объекта.
2) Убиваете этот объект.

В чем цимес? GC сканирут только живые объекты. Всё остальное считается собирабельным и очищается скопом. Объем удаляемых объектов влияет намного меньше, чем объем живых.
...
Рейтинг: 0 / 0
Нагрузить gc, интереса ради, а не дела для.
    #38298888
Фотография grasoff.net
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokstop-at-wordчетыре ошибки, чорт побери!

stop the world
...
Рейтинг: 0 / 0
Нагрузить gc, интереса ради, а не дела для.
    #38298905
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смоделировать что-то вроде сильносвязного ор-графа. Чтоб связи рёбер были в обе стороны.
Я думаю что грохнуть его будет довольно сложно.
...
Рейтинг: 0 / 0
Нагрузить gc, интереса ради, а не дела для.
    #38298979
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем, как оказалось, нагрузить gc таким способом довольно легко, причем хватает даже пункта 1, но вот механизм загрузки получился несколько не тот, который я хотел получить.

Ранее я делал так - запоняется большой массив обьектов до большого размера, потом в нем четные объекты удаляются. Потом он снова заполняется и тд. Этот тест у меня не грузил gc и не сохранился.

Если же создавать делать много связанных обьектов, то full gc вызывается уже на этапе их создания, причем бывает что по нескольку раз. Это в сборке 1.7.0_21. Я так понимаю, что ей перестает хватать eden, поэтому обьекты форсированно уходят в survivol/tenured, но предварительно вызывается fullgc. И он пробегает по всем связям, что занимает время. То есть, даже создать много обьектов - это уже проблема.

проект я закинул на https://github.com/chabapok/gc-perfkiller.git
там до п2. дело не доходит и код не дописан, взможно чуть позже попробую что будет.

Если запускать его с -Xmx512m то тормозов много. Full gc бывало что вызывался по 3 раза подряд, и между вызовами поток с максимальным приоритетом не просыпался, таким образом у меня получалось diff=14сек тормозов.
Если дать ей -Xmx4G, то full gc все равно вызывается но значительно реже, тормоз максимальный 2.8сек получался.

Таким образом я сделал следующие выводы.
Тормоза gc может вызывать в том числе (но не ограничиваясь) и от того, что ему мало памяти. Это очень интересный момент, потому что раньше я думал, что чем меньше памяти, тем быстрей gc может ее оббежать - то есть будет вызываться чаще но stop the world будет занимать меньшее время. Оказывается, нет.

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

Насколько тест был корректным - не знаю.
...
Рейтинг: 0 / 0
Нагрузить gc, интереса ради, а не дела для.
    #38299013
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokХотелось воспроизвести именно тормоза на чистке большого количества долголежащих обьектов, ставших ненужными.
Доктор, меня игнорируют. Сконцентрируйтесь. GC не сканирует объекты, которые можно удалить. GC сканирует живые объекты, а остальные удаляет. Основаня нагрузка возникает при сканировании живых объектов в tenured. Чем больше живых объектов, тем больше работы у GC.
...
Рейтинг: 0 / 0
Нагрузить gc, интереса ради, а не дела для.
    #38299182
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я вас не игнорирую, я вам не верю :))

gc должен сканировать и то и другое, потому что, чтобы не сканировать мертвые обьекты, нужно сначала понять, что их сканировать не надо. gc должен вычислять "дырки" и при надобности переносить обьекты или ремапить память (но ведь это прерогативая ядра?), чтобы освобождать непрерывные регионы, (если это требуется). Собственно, я думал (по всей видимости - неверно), что основаня работа - копирование участков памяти.

Другое дело, что живые сканировать так или иначе придется постоянно, а уже недоступные - только однажды/несколько раз.
...
Рейтинг: 0 / 0
Нагрузить gc, интереса ради, а не дела для.
    #38299196
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokА я вас не игнорирую, я вам не верю :))

gc должен сканировать и то и другое, потому что, чтобы не сканировать мертвые обьекты, нужно сначала понять, что их сканировать не надо. gc должен вычислять "дырки" и при надобности переносить обьекты или ремапить память (но ведь это прерогативая ядра?), чтобы освобождать непрерывные регионы, (если это требуется). Собственно, я думал (по всей видимости - неверно), что основаня работа - копирование участков памяти.

Другое дело, что живые сканировать так или иначе придется постоянно, а уже недоступные - только однажды/несколько раз.

Знаете вопрос веры тут не при чем, когда есть четкое описание того как работает GC. Таки да, он сканирует только живые объекты
...
Рейтинг: 0 / 0
Нагрузить gc, интереса ради, а не дела для.
    #38299218
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну это больше вопрос терминологии, мне кажется.
Что такое "сканирует"? Обойти и маркировать - да, только живые. Как же иначе.

Но попробуйте сделать свой аллокатор c функцией освобождения реализованной через mark&sweep - вы очень быстро поймете, что маркировка - это лишь одна из фаз. Когда вам нужно найти память для очередного new - надо искать "дырки" в памяти. То есть так или иначе, в неявной форме опрерировать пространством адресов, в которых раньше могло что-то храниться. Можно ли это назвать сканированием? Можно ли назвать обходом неживых обьектов? Не важно как мы это назовем. Все равно мы оперируем этими сущностями.
...
Рейтинг: 0 / 0
Нагрузить gc, интереса ради, а не дела для.
    #38299237
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokНу это больше вопрос терминологии, мне кажется.
Что такое "сканирует"? Обойти и маркировать - да, только живые. Как же иначе.

Но попробуйте сделать свой аллокатор c функцией освобождения реализованной через mark&sweep - вы очень быстро поймете, что маркировка - это лишь одна из фаз. Когда вам нужно найти память для очередного new - надо искать "дырки" в памяти. То есть так или иначе, в неявной форме опрерировать пространством адресов, в которых раньше могло что-то храниться. Можно ли это назвать сканированием? Можно ли назвать обходом неживых обьектов? Не важно как мы это назовем. Все равно мы оперируем этими сущностями.

При чем тут "дырки"? Возьмите и почитайте как работает аллокация, про card marking и тп. Ну не обходит он мертвые объекты ну никак, поэтому тезиис что чтобы нагрузить gc, надо создать граф взаимосвязанных объектов и потом убить ссылку на главный объект - неверен. Именно потому что все они автоматом идут в утиль, когда gc обнаружит что ничего не доступно через roots, он имеет право взять и обнулить всю память например.
...
Рейтинг: 0 / 0
Нагрузить gc, интереса ради, а не дела для.
    #38299251
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник,

А, ну это да. Я просто не сразу врубился о чем вы. С процессом маркировки - ясно.

теперь про другое.

Full GC когда вызывается? когда не хватает памяти для аллоцирования. И что происходит -- надо просканить все связи и дефрагментировать память. Это я правильно понял?
Была прога когда связей мало, а дефрагментировать надо много. И был прога когда связей много, но недоступных обьектов мало.

Вторая прога явно нагружает проц сильней, при равном кол-ве объектов. Мне это показалось странным.
...
Рейтинг: 0 / 0
Нагрузить gc, интереса ради, а не дела для.
    #38299259
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokFull GC когда вызывается? когда не хватает памяти для аллоцирования. И что происходит -- надо просканить все связи и дефрагментировать память. Это я правильно понял?


Вообще говоря, это зависит от алгоритма собрщика. Именно поэтому при написании высоконагруженных приложений приходятся знать паттерны работы с памятью, чтобы подобрать оптмальный. Хороший блог по GC вы можете найти если погуглите Роман Елизаров.
...
Рейтинг: 0 / 0
Нагрузить gc, интереса ради, а не дела для.
    #38299261
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Точнее блог Алексея Рагозина - http://blog.ragozin.info/p/garbage-collection.html. Странно я вроде помню что читал на русском, но и на английском тоже полезно. Ну Елизарова тоже полезно почитать между прочим)
...
Рейтинг: 0 / 0
Нагрузить gc, интереса ради, а не дела для.
    #38300340
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokя вам не верю :))
LOL. Хотя прям бери и основывай церковь GC и Hotspot.
Можно найти описание работы алгоритмов GC в Hotspot и там посмотри когда конкретно активируются stop-the-world фазы.
Всё очень сильно зависит от типа сборщика. Но те, которые используются по-умолчанию, - mark and sweep. Работают схожим образом.
Если надо тупо посмотреть на паузы, то можно использовать Serial, у которого все сборки - stop-the-world. Зато максимальный throughput.
Если нужно выявить паузы на каком-то конкретном алгоритме, то стоит, наверное, начать с изучения этих алгоритмов.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Нагрузить gc, интереса ради, а не дела для.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]