CMS сборщик мусора - когда он запускается? - PullRequest
10 голосов
/ 14 марта 2012

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

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

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

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

1 Ответ

12 голосов
/ 14 марта 2012

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

См. Например ...

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

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

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

По умолчанию виртуальная машина увеличивает или уменьшает кучу в каждой коллекции, чтобы попытаться сохранить пропорцию свободного пространства для живых объектов в каждой коллекции в пределах определенного диапазона. Этот целевой диапазон задается в процентах параметрами -XX:MinHeapFreeRatio=<minimum> и -XX:MaxHeapFreeRatio=<maximum>, а общий размер ограничен снизу -Xms и выше -Xmx.

.. или ..

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

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

РЕДАКТИРОВАТЬ: Я провел несколько симуляций с тестовой программой, которая просто случайным образом создает карты байтовых массивов и копирует их. Я заметил, что а) значение фракции не соблюдается - в частности, при консервативном значении (скажем, 50) начальная стадия оценки CMS превысила 50% заполненности, обычно около 70-80% и b) тем не менее меньшие значения доли сделали CMS начальный этап случиться раньше (используется программа -Xmx1536m -Xmx1536m -XX:NewSize=512m -XX:+UseConcMarkSweepGc + gc logging и два тестовых параметра)

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

...