Поведение Java CMS GC

У меня есть приложение, которое вызывает много мусора. Первый (и почти один) критерий - малое время паузы в GC. Я пробую разные параметры GC, используя инструмент visualgc (и gc logs). Лучшие параметры ниже.

-XX: + UseConcMarkSweepGC

-Xmx1172M

-Xms600M

-XX: + UseParNewGC

-XX: NewSize = 150M

Мое приложение работает на SunOS 10 с Java 1.6.0_21 . Аппаратное обеспечение - два четырехъядерных процессора (uname -X результат numCPU = 8).

Вопросы

Наблюдая за поведением GC, новые объекты создаются в пространстве eden, пока eden не заполнится. Когда GC заполняется на eden space, выполняется очистка мусора, если объект не является мертвой копией в Old-gen (я отбрасываю пробелы 'и' в '), аналогичным образом Old-Gen заполнен, GC запускается с фазой одновременной работы CMS и очищает Old Пространство Некоторая часть CMS - Stop-the-world (время паузы). Это петля.

  1. Это выше Scenerio правда?
  2. После того, как GC очистит пространство старого поколения, не хватает места для расширения пространства старого поколения (значения XMS и XMS различаются)?
  3. Когда начнется полная работа ГХ? Как это решить?
  4. Продолжительность фазы CMS-параллелизма зависит от размера пространства Eden, на самом деле я ожидаю, что пространство Eden не влияет на длительность фазы CMS-параллелизма. Что происходит с GC в связи с пространством Eden на CMS-параллельной фазе?
  5. Что еще предлагает мне минимизировать время паузы? Действительно, Самый ценный ответ для меня:)

Спасибо

2 ответа

Решение

Вы не можете просто игнорировать пробелы выживших при использовании CMS. CMS не является сборщиком сжатия, а это означает, что если вы (или JVM) неверно определите порог владения, то вы будете медленно отбирать объекты во владение, что увеличит частоту, с которой останавливаются фрагменты, что приведет к переносу времени, когда CMS принудительно вызывается, потому что это недостаточно непрерывного свободного пространства, доступного для обработки повышений из оставшихся в живых мест в арендованный, что приведет к полному циклу gc без предварительного предупреждения, и, следовательно, это полная вещь в паузе 1 STW. Сколько времени это займет, будет зависеть от размера вашей кучи, но очень вероятно, что одна вещь будет на несколько порядков дольше, чем обычная коллекция eden.

Здесь следует отметить еще несколько вещей;

  1. STW паузы приходят не только из CMS, но и из сборщика молодого поколения
  2. CMS имеет 2 фазы STW (отметка и примечание) и 3-4 параллельных фазы, 1-я фаза STW (отметка) является строго однопоточной, что может вызвать проблемы (пример обсуждения по этому вопросу здесь)
  3. Вы можете контролировать количество потоков, обрабатывающих параллельные фазы
  4. Вы должны понимать, как долго объекты живут, это может означать использование -XX:+PrintTenuringDistribution или вы можете просто посмотреть его с VisualGC, как вы сделали
  5. Затем вы можете настроить это с -XX:SurvivorRatio контролировать размер оставшихся в живых пространств относительно Эдема и -XX:MaxTenuringThreshold контролировать, как часто объект может пережить молодую коллекцию, прежде чем он будет храниться
  6. -XX:CMSInitiatingOccupancyFraction может использоваться для указания CMS относительно того, насколько полной она должна быть до начала фазы CMS (поймите это неправильно, и вы сделаете паузу плохо)

В конечном итоге вам необходимо понять, какой сборщик делает паузу, как часто, как долго и существуют ли какие-либо ненормальные причины этой паузы. Затем вам необходимо сравнить это с размером каждого поколения, чтобы увидеть, можете ли вы настроить параметры таким образом, чтобы минимизировать количество (и / или продолжительность) пауз.

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

Одним хорошим источником сводной информации о внутренностях является блог Джона Масамицу. Еще одна хорошая презентация об этом - GC Tuning в Java HotSpot.

Лучший способ минимизировать влияние GC - минимизировать количество создаваемых объектов. Это не всегда легко сделать или лучшее решение в целом, но это минимизирует паузы ГХ.

Если вы не можете производить меньше объектов, постарайтесь сделать их достаточно короткими, а пространство Эдема достаточно большим, чтобы они не покидали пространство Эдема. (Или сделать очень долго живым и использовать повторно)

  1. Здесь есть три места для беспокойства, eden -> уцелевший -> постоянный http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

  2. GC пытается обеспечить достаточно свободного места после полного сбора GC и -ms а также -mx параметры контролируют, насколько большими они будут (ранее известный как -Xms а также -Xmx)

  3. Полный GC начинается, когда заполненное пространство заполнено, или пространство для вспомогательного объекта исчерпано (например, слишком много объектов скопировано из пространства eden), или теперь описания CMS являются хорошей плиткой, чтобы попытаться выполнить параллельную очистку.

  4. CMS только очищает арендованное пространство.

  5. Смотрите мои предыдущие ответы.

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