2012-03-14 2 views
9

Я смущен о двух параметрах, которые могут контролировать, когда пинки коллекторные CMS в:CMS сборщик мусора - когда он запускается?

MaxHeapFreeRatio (70% по умолчанию)

CMSInitiatingOccupancyFraction (более 90% по умолчанию)

Что делает каждый из тех, параметры означают, точно? Когда начинается сборщик (фаза маркировки) и собирается (этап подметания)?

ответ

11

CMSInitiatingOccupancyFraction решает, когда запускается CMS (для того, чтобы этот параметр был эффективным, вы также должны установить XX: + UseCMSInitiatingOccupancyOnly). MaxHeapFreeRatio - это опция для определения размеров пространства поколений.

Смотрите, например ...

http://java.sun.com/docs/hotspot/gc1.4.2/faq.html

Параллельное коллекция в целом не может быть ускорен, но это может быть начато ранее. Параллельная коллекция запускается, когда процент выделенного пространства в старом поколении пересекает порог. Этот порог рассчитывается на основе общего опыта с параллельным коллектором. Если будут собраны полные коллекции, возможно, потребуется запустить параллельные коллекции раньше. Флаг командной строки CMSInitiatingOccupancyFraction может использоваться для установки уровня, на котором начинается сбор. Его значение по умолчанию составляет около 68%. Командная строка для настройки значения является -XX: CMSInitiatingOccupancyFraction =

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

По умолчанию виртуальной машина увеличивает или сокращает кучу в каждой коллекции, чтобы попытаться сохранить долю свободного пространства для жизни объектов в каждая коллекция в определенном диапазоне. Этот целевой диапазон устанавливается в процентах по параметрам -XX: MinHeapFreeRatio = и -XX: MaxHeapFreeRatio =, а общий размер ограничен ниже на -Xms и выше на -Xmx. Параметры по умолчанию для 32-разрядной операционной системы на Solaris (SPARC Platform Edition) приведены в таблице:

.. или ..

http://www.petefreitag.com/articles/gctuning/

-XX: MaxHeapFreeRatio - когда процент свободного пространство в поколении превысило это значение, поколение будет сокращаться, чтобы соответствовать этому значению. Значение по умолчанию: 70

EDIT: Я провел несколько симуляций с помощью тестовой программы, которая просто произвольно создает карты массивов байтов и копирует их. Я заметил, что а) значение фракции не соблюдалось - в частности, с консервативным значением (скажем, 50) начальная ступень оценки CMS начиналась намного выше 50% занятости, обычно около 70-80% и б) тем не менее меньшие значения фракций делали CMS начальная стадия произойдет ранее (программа используется -Xmx1536m -Xmx1536m -XX: NewSize = 512m -XX: + UseConcMarkSweepGc + протоколирования дс и два параметра теста)

Я также нашел старый отчет об ошибке относительно этого: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6486089

+3

'CMSInitiatingOccupancyFraction' используется только для 1-й коллекции, если не установлен параметр -XX: + UseCMSInitiatingOccupancyOnly'. Если вы не установите последний переключатель, то после первого, обычные методы эвристики (которые основаны на статистике распределения, собранной во время выполнения) используются для определения того, когда начинается CMS. – Matt

+0

Спасибо, Мэтт, я добавил это. – moodywoody

+0

По некоторым наблюдениям, похоже, что после нескольких ночных часов с низким уровнем использования он не ударил, пока не достиг более 90% (это 'CMSInitiatingOccupancy'. Однако в течение дня он, кажется, не дожидался так долго, но собирался раньше. Кажется, это соответствует тому, что сказал @Matt, но в этом случае я хотел бы знать, что такое «обычная эвристика» и как долго мирное время заставляет его спящать и ждать порога> 90%. –

Смежные вопросы