digital-garden/knowledge/dev/java/gc/Concurrent Mark Sweep.md

43 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
aliases:
- Concurrent Mark Sweep
- CMS
tags:
- зрелость/🌱
date: "[[2023-11-06]]"
zero-link:
- "[[../../../../garden/ru/meta/zero/00 Java разработка]]"
parents:
- "[[../../../../garden/ru/dev/java/gc/Garbage Collector]]"
linked: []
---
Появился в [Java 7](Java%207.md) и использует [Generational Collection](Generational%20Collection.md).
Очистка Young Generation выполняется так же, как и в [Parallel Compacting Collector](Parallel%20Compacting%20Collector.md) c использованием [StopTheWorld](StopTheWorld.md) и [параллельного](Parallel%20Collection.md) [Copy Collector](Copy%20Collector.md). А сборка в старом поколении использует [фоновый](Concurrent%20Collection.md) [Mark and Compact](Mark%20and%20Compact.md).
Очистка Old Generation выполняется следующим образом:
- **Initial Mark.** Происходит остановка приложения ([StopTheWorld](StopTheWorld.md) при этом происходит быстро), во время остановки помечаются корневые объекты (Root GC)
- **Concurrent Mark** - GC параллельно с работой программы производит поиск живых объектов доступных из уже помеченных корневых объектов.
- **Remark** - помечает живые объекты, которые могли ускользнуть от GC во время предыдущей фазы. Здесь происходит короткий [StopTheWorld](StopTheWorld.md).
- **Concurrent Sweep** - работа основных потоков приложения возобновляется - сборщик производит очистку памяти от мертвых объектов в нескольких параллельных фоновых потоках. При этом могут в живых остаться объекты, которые на этот момент таковыми уже не являются - плавающий мусор (floating garbage). Такие объекты будут удалены при следующей сборке мусора.
- **Resetting** - подготовка к следующему параллельному сбору
![](Pasted%20image%2020231107220238.png)
Так как в таком режиме дефрагментация не происходит, может сложится ситуация, когда мы не сможем аллоцировать большой объект. В этом случае будет запущена полная сборка мусора, которая приведет к полной остановке приложения, и будет выполняться в одном потоке.
**Плюсы:**
- Предсказуемое время сборки. У нас 2 паузы [StopTheWorld](StopTheWorld.md), но они минимальны и при этом сборщик работает в нескольких потоках и в фоновом режиме.
- Мертвые объекты по возможности собираются параллельно без [StopTheWorld](StopTheWorld.md).
**Минусы:**
- Потребление CPU на фоновую работу 10-15%
- Менее эффективное использование ОЗУ. Мусор собирается медленнее, так как мы тратим больше времени на поиск.
- Не выполняет дефрагментацию. Это плохо тем, что становится невозможно поместить большой объект со временем, например, какой-нибудь большой массив. Тогда будет выполнена полная сборка мусора.
- [Аллокация](Аллокация.md) с использованием free-листов.
**Где можно использовать:**
- Такой сборщик уже подходит для использования в web-приложениях.
**Как включить:**
- `-XX:+UseConcMarkSweepGC`