digital-garden/knowledge/dev/java/gc/Concurrent Mark Sweep.md
2024-06-13 21:01:37 +03:00

4.2 KiB
Raw Blame History

aliases tags date zero-link parents linked
Concurrent Mark Sweep
CMS
зрелость/🌱
2023-11-06
00 Java разработка
Garbage Collector

Появился в Java 7 и использует Generational Collection.

Очистка Young Generation выполняется так же, как и в Parallel Compacting Collector c использованием StopTheWorld и параллельного Copy Collector. А сборка в старом поколении использует фоновый Mark and Compact.

Очистка Old Generation выполняется следующим образом:

  • Initial Mark. Происходит остановка приложения (StopTheWorld при этом происходит быстро), во время остановки помечаются корневые объекты (Root GC)
  • Concurrent Mark - GC параллельно с работой программы производит поиск живых объектов доступных из уже помеченных корневых объектов.
  • Remark - помечает живые объекты, которые могли ускользнуть от GC во время предыдущей фазы. Здесь происходит короткий StopTheWorld.
  • Concurrent Sweep - работа основных потоков приложения возобновляется - сборщик производит очистку памяти от мертвых объектов в нескольких параллельных фоновых потоках. При этом могут в живых остаться объекты, которые на этот момент таковыми уже не являются - плавающий мусор (floating garbage). Такие объекты будут удалены при следующей сборке мусора.
  • Resetting - подготовка к следующему параллельному сбору

Так как в таком режиме дефрагментация не происходит, может сложится ситуация, когда мы не сможем аллоцировать большой объект. В этом случае будет запущена полная сборка мусора, которая приведет к полной остановке приложения, и будет выполняться в одном потоке.

Плюсы:

  • Предсказуемое время сборки. У нас 2 паузы StopTheWorld, но они минимальны и при этом сборщик работает в нескольких потоках и в фоновом режиме.
  • Мертвые объекты по возможности собираются параллельно без StopTheWorld.

Минусы:

  • Потребление CPU на фоновую работу 10-15%
  • Менее эффективное использование ОЗУ. Мусор собирается медленнее, так как мы тратим больше времени на поиск.
  • Не выполняет дефрагментацию. Это плохо тем, что становится невозможно поместить большой объект со временем, например, какой-нибудь большой массив. Тогда будет выполнена полная сборка мусора.
  • Аллокация с использованием free-листов.

Где можно использовать:

  • Такой сборщик уже подходит для использования в web-приложениях.

Как включить:

  • -XX:+UseConcMarkSweepGC