Поведение Java CMS GC - PullRequest
       45

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

6 голосов
/ 16 марта 2011

У меня есть приложение, которое создает много мусора.Первый (и почти один) критерий - малое время паузы в 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 ]

10 голосов
/ 17 марта 2011

Вы не можете просто игнорировать пробелы выживших при использовании 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, чтобы контролировать размерместа для выживших относительно eden и -XX:MaxTenuringThreshold для контроля того, как часто объект может пережить молодую коллекцию до его владения
  6. -XX:CMSInitiatingOccupancyFraction можно использовать для указания CMS относительно того, как fuДолжно ли это быть до того, как начнется фаза CMS (поймите это неправильно, и вы будете делать паузу плохо)

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

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

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

2 голосов
/ 16 марта 2011

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...