Вы не можете просто игнорировать пробелы выживших при использовании CMS.CMS не является сборщиком сжатия, что означает, что если вы (или JVM) неправильно определите порог владения, то вы будете медленно перетекать объекты в владение, что увеличит скорость, с которой фрагменты со сроком владения будут переносить время, когда CMS принудительно вызывается, потому что этонедостаточно непрерывного свободного пространства, доступного для обработки продвижений из оставшихся в живых мест в арендованный, что приведет к полному циклу gc без предварительного предупреждения, и, следовательно, это полная вещь в паузе 1 STW.Сколько времени это займет, будет зависеть от размера вашей кучи, но очень вероятно, что одна вещь будет на несколько порядков дольше, чем обычная коллекция eden.
Здесь есть еще несколько вещей, на которые стоит обратить внимание;
- Паузы STW не только исходят из CMS, но и от сборщика молодого поколения
- CMS имеет 2 фазы STW (отметка и примечание) и 3-4 одновременных фазы, 1-я STWФаза (метка) строго однопоточная, что может вызвать проблемы (пример обсуждения по этому вопросу здесь )
- Вы можете контролировать количество потоков, обрабатывающих параллельные фазы
- Вам необходимопонять, как долго объекты живут, это может означать использование
-XX:+PrintTenuringDistribution
, или вы можете просто посмотреть его с VisualGC, как вы сделали - Затем вы можете настроить это с помощью
-XX:SurvivorRatio
, чтобы контролировать размерместа для выживших относительно eden и -XX:MaxTenuringThreshold
для контроля того, как часто объект может пережить молодую коллекцию до его владения -XX:CMSInitiatingOccupancyFraction
можно использовать для указания CMS относительно того, как fuДолжно ли это быть до того, как начнется фаза CMS (поймите это неправильно, и вы будете делать паузу плохо)
В конечном счете, вам необходимо понять, какой сборщик делает паузу, как часто, как долго, и существует лилюбые ненормальные причины этой паузы.Затем вам нужно сравнить это с размером каждого поколения, чтобы увидеть, можете ли вы настроить параметры таким образом, чтобы минимизировать количество (и / или продолжительность) пауз.
Помните, что это может быть временная задержкаиз-за необходимости длительных тестов, чтобы увидеть, ухудшается ли он с течением времени.Кроме того, без повторяющейся, автоматизированной рабочей нагрузки почти невозможно сделать какие-либо твердые выводы относительно того, действительно ли вы что-то улучшили.
Один хороший источник сводной информации о внутреннем устройстве - блог Джона Масамицу .Еще одна хорошая презентация об этом - GC Tuning в HotSpot Java VM .