|
|
|
Нагрузить gc, интереса ради, а не дела для.
|
|||
|---|---|---|---|
|
#18+
Периодически попадаются статьи, в которых пишут что-то вроде "у нас stop-at-word gc повесил систему на пять минут" (hotspot server vm). Я вот сколько раз пытался написать прогу, которая специально создаст "тяжелые" для gc условия - не выходило. вопрос вот в чем - с 512мб хипа по умолчанию это вообще реально? Ну, пускай не на 5 минут подвесить, но секунд хотя б на 10. Или нужны сотни гигабайт? То есть задача состоит в том, чтобы сделать что-либо, чтобы одно new вызвало stop-at-word и секунд хотя бы 10 все висело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2013, 23:26:25 |
|
||
|
Нагрузить gc, интереса ради, а не дела для.
|
|||
|---|---|---|---|
|
#18+
chabapok , Практической ценности в этом действительно нет. Вообще никакой. А попробовать можете следующее: 1) Забиваете хип кучей связанных друг с другом объектов, которые видны только из одного объекта. 2) Выжидаете несколько minor GC, что бы эти объекты ушли в tenured. 2) Убиваете этот объект. 3) С параллельного треда постоянно что-то отпечатываете в консоль. Идея заключается в том, что бы в хипе одномоментно оказывается много orphaned объектов, с большим количеством связей. По идее, в параллельном "печатающем" треде вы, может быть, сможете заметить stop-the-world во время мажорной сборки. Ну и плюс поиграться с настройками GC - с размером tenured, алгоритмом сборки, трешолды какие-нибудь выставить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2013, 23:51:16 |
|
||
|
Нагрузить gc, интереса ради, а не дела для.
|
|||
|---|---|---|---|
|
#18+
chabapok, Включаем serial collector. 512Мб - мало. Сурьезные проблемы обычно начинаются с кучами за 4Гб. Настраиваем Eden на минимум, tenured на максимум. И забиваем до отказа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2013, 00:54:57 |
|
||
|
Нагрузить gc, интереса ради, а не дела для.
|
|||
|---|---|---|---|
|
#18+
iMove1) Забиваете хип кучей связанных друг с другом объектов, которые видны только из одного объекта. 2) Убиваете этот объект. В чем цимес? GC сканирут только живые объекты. Всё остальное считается собирабельным и очищается скопом. Объем удаляемых объектов влияет намного меньше, чем объем живых. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2013, 00:56:49 |
|
||
|
Нагрузить gc, интереса ради, а не дела для.
|
|||
|---|---|---|---|
|
#18+
chabapokstop-at-wordчетыре ошибки, чорт побери! stop the world ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2013, 10:09:31 |
|
||
|
Нагрузить gc, интереса ради, а не дела для.
|
|||
|---|---|---|---|
|
#18+
Смоделировать что-то вроде сильносвязного ор-графа. Чтоб связи рёбер были в обе стороны. Я думаю что грохнуть его будет довольно сложно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2013, 11:00:39 |
|
||
|
Нагрузить gc, интереса ради, а не дела для.
|
|||
|---|---|---|---|
|
#18+
Вобщем, как оказалось, нагрузить 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 все равно что-то находил и подчищал. Насколько тест был корректным - не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2013, 13:51:07 |
|
||
|
Нагрузить gc, интереса ради, а не дела для.
|
|||
|---|---|---|---|
|
#18+
chabapokХотелось воспроизвести именно тормоза на чистке большого количества долголежащих обьектов, ставших ненужными. Доктор, меня игнорируют. Сконцентрируйтесь. GC не сканирует объекты, которые можно удалить. GC сканирует живые объекты, а остальные удаляет. Основаня нагрузка возникает при сканировании живых объектов в tenured. Чем больше живых объектов, тем больше работы у GC. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2013, 14:51:09 |
|
||
|
Нагрузить gc, интереса ради, а не дела для.
|
|||
|---|---|---|---|
|
#18+
А я вас не игнорирую, я вам не верю :)) gc должен сканировать и то и другое, потому что, чтобы не сканировать мертвые обьекты, нужно сначала понять, что их сканировать не надо. gc должен вычислять "дырки" и при надобности переносить обьекты или ремапить память (но ведь это прерогативая ядра?), чтобы освобождать непрерывные регионы, (если это требуется). Собственно, я думал (по всей видимости - неверно), что основаня работа - копирование участков памяти. Другое дело, что живые сканировать так или иначе придется постоянно, а уже недоступные - только однажды/несколько раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2013, 20:57:37 |
|
||
|
Нагрузить gc, интереса ради, а не дела для.
|
|||
|---|---|---|---|
|
#18+
chabapokА я вас не игнорирую, я вам не верю :)) gc должен сканировать и то и другое, потому что, чтобы не сканировать мертвые обьекты, нужно сначала понять, что их сканировать не надо. gc должен вычислять "дырки" и при надобности переносить обьекты или ремапить память (но ведь это прерогативая ядра?), чтобы освобождать непрерывные регионы, (если это требуется). Собственно, я думал (по всей видимости - неверно), что основаня работа - копирование участков памяти. Другое дело, что живые сканировать так или иначе придется постоянно, а уже недоступные - только однажды/несколько раз. Знаете вопрос веры тут не при чем, когда есть четкое описание того как работает GC. Таки да, он сканирует только живые объекты ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2013, 21:44:17 |
|
||
|
Нагрузить gc, интереса ради, а не дела для.
|
|||
|---|---|---|---|
|
#18+
Ну это больше вопрос терминологии, мне кажется. Что такое "сканирует"? Обойти и маркировать - да, только живые. Как же иначе. Но попробуйте сделать свой аллокатор c функцией освобождения реализованной через mark&sweep - вы очень быстро поймете, что маркировка - это лишь одна из фаз. Когда вам нужно найти память для очередного new - надо искать "дырки" в памяти. То есть так или иначе, в неявной форме опрерировать пространством адресов, в которых раньше могло что-то храниться. Можно ли это назвать сканированием? Можно ли назвать обходом неживых обьектов? Не важно как мы это назовем. Все равно мы оперируем этими сущностями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2013, 22:43:55 |
|
||
|
Нагрузить gc, интереса ради, а не дела для.
|
|||
|---|---|---|---|
|
#18+
chabapokНу это больше вопрос терминологии, мне кажется. Что такое "сканирует"? Обойти и маркировать - да, только живые. Как же иначе. Но попробуйте сделать свой аллокатор c функцией освобождения реализованной через mark&sweep - вы очень быстро поймете, что маркировка - это лишь одна из фаз. Когда вам нужно найти память для очередного new - надо искать "дырки" в памяти. То есть так или иначе, в неявной форме опрерировать пространством адресов, в которых раньше могло что-то храниться. Можно ли это назвать сканированием? Можно ли назвать обходом неживых обьектов? Не важно как мы это назовем. Все равно мы оперируем этими сущностями. При чем тут "дырки"? Возьмите и почитайте как работает аллокация, про card marking и тп. Ну не обходит он мертвые объекты ну никак, поэтому тезиис что чтобы нагрузить gc, надо создать граф взаимосвязанных объектов и потом убить ссылку на главный объект - неверен. Именно потому что все они автоматом идут в утиль, когда gc обнаружит что ничего не доступно через roots, он имеет право взять и обнулить всю память например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.06.2013, 23:27:21 |
|
||
|
Нагрузить gc, интереса ради, а не дела для.
|
|||
|---|---|---|---|
|
#18+
забыл ник, А, ну это да. Я просто не сразу врубился о чем вы. С процессом маркировки - ясно. теперь про другое. Full GC когда вызывается? когда не хватает памяти для аллоцирования. И что происходит -- надо просканить все связи и дефрагментировать память. Это я правильно понял? Была прога когда связей мало, а дефрагментировать надо много. И был прога когда связей много, но недоступных обьектов мало. Вторая прога явно нагружает проц сильней, при равном кол-ве объектов. Мне это показалось странным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2013, 00:19:50 |
|
||
|
Нагрузить gc, интереса ради, а не дела для.
|
|||
|---|---|---|---|
|
#18+
chabapokFull GC когда вызывается? когда не хватает памяти для аллоцирования. И что происходит -- надо просканить все связи и дефрагментировать память. Это я правильно понял? Вообще говоря, это зависит от алгоритма собрщика. Именно поэтому при написании высоконагруженных приложений приходятся знать паттерны работы с памятью, чтобы подобрать оптмальный. Хороший блог по GC вы можете найти если погуглите Роман Елизаров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2013, 00:47:09 |
|
||
|
Нагрузить gc, интереса ради, а не дела для.
|
|||
|---|---|---|---|
|
#18+
Точнее блог Алексея Рагозина - http://blog.ragozin.info/p/garbage-collection.html. Странно я вроде помню что читал на русском, но и на английском тоже полезно. Ну Елизарова тоже полезно почитать между прочим) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2013, 01:00:50 |
|
||
|
Нагрузить gc, интереса ради, а не дела для.
|
|||
|---|---|---|---|
|
#18+
chabapokя вам не верю :)) LOL. Хотя прям бери и основывай церковь GC и Hotspot. Можно найти описание работы алгоритмов GC в Hotspot и там посмотри когда конкретно активируются stop-the-world фазы. Всё очень сильно зависит от типа сборщика. Но те, которые используются по-умолчанию, - mark and sweep. Работают схожим образом. Если надо тупо посмотреть на паузы, то можно использовать Serial, у которого все сборки - stop-the-world. Зато максимальный throughput. Если нужно выявить паузы на каком-то конкретном алгоритме, то стоит, наверное, начать с изучения этих алгоритмов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2013, 16:32:13 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38298835&tid=2129149]: |
0ms |
get settings: |
19ms |
get forum list: |
25ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
45ms |
get topic data: |
20ms |
get forum data: |
5ms |
get page messages: |
95ms |
get tp. blocked users: |
3ms |
| others: | 320ms |
| total: | 546ms |

| 0 / 0 |
