GC паузы становятся очень длинными после нескольких дней

Я использую систему сборки. Мы привыкли использовать коллектор CMS, но мы начали страдать от очень длинных полных циклов GC, пропускная способность (время без GC) составляла около 90%. Поэтому я решил переключиться на G1, предполагая, что даже если у меня будет больше общее время GC, паузы будут короче, что обеспечит более высокую доступность. Таким образом, эта идея, казалось, работала даже лучше, чем я ожидал, я не видел полного GC в течение почти 3 дней, пропускная способность была 97%, общая производительность GC была намного лучше. (Все скриншоты и данные получены из GCViewer)

Нормальный

До сих пор (6 день). Сегодня система просто взбесилась. Старое используемое пространство составляет чуть менее 100%. Я вижу, что Full GC срабатывает почти каждые 2-3 минуты или около того: Berzerk

Использование старого пространства: Старое пространство

Размер кучи составляет 20G (всего 128G Ram). Флаги, которые я сейчас использую:

-XX:+UseG1GC
-XX:MaxPermSize=512m
-XX:MaxGCPauseMillis=800
-XX:GCPauseIntervalMillis=8000 
-XX:NewRatio=4
-XX:PermSize=256m
-XX:InitiatingHeapOccupancyPercent=35
-XX:+ParallelRefProcEnabled

плюс логирование флагов. То, что я, кажется, пропускаю -XX:+ParallelGCThreads=20 (У меня 32 процессора), по умолчанию должно быть 8. Я также прочитал из оракула, что было бы предложено иметь -XX:+G1NewSizePercent=4 для кучи 20G по умолчанию должно быть 5.

Я использую Java HotSpot(TM) 64-битный сервер VM 1.7.0_76, Oracle Corporation

Что ты предлагаешь? У меня есть очевидные ошибки? Что поменять? Я жадный, давая Java только 20G? Здесь предполагается, что слишком большая куча будет означать, что GC будет длиннее, так как нужно просто убрать (крестьянская логика).

PS: приложение не мое. Для меня это коробочный продукт.

1 ответ

Что ты предлагаешь? У меня есть очевидные ошибки? Что поменять? Я жадный, давая Java только 20G? Здесь предполагается, что слишком большая куча будет означать, что GC будет длиннее, так как нужно просто убрать (крестьянская логика).

Если он запускает полные GC, но ваша занятость остается на уровне около 20 ГБ, то, возможно, у GC просто не хватает места для дыхания, либо для удовлетворения потребности в огромных распределениях, либо для достижения некоторых из своих целей (пропускная способность, время паузы), что заставляет полный сборщик мусора как запасной вариант.

Так что вы можете попытаться увеличить предел кучи или ослабить цели пропускной способности.

Как упоминалось ранее в моем комментарии, вы также можете попробовать перейти на java8 для улучшения эвристики G1.

Для дальнейших рекомендаций было бы полезно использовать журналы GC, описывающие поведение "берзерк".

Другие вопросы по тегам