43 lines
4.2 KiB
Markdown
43 lines
4.2 KiB
Markdown
|
---
|
|||
|
aliases:
|
|||
|
- Concurrent Mark Sweep
|
|||
|
- CMS
|
|||
|
tags:
|
|||
|
- зрелость/🌱
|
|||
|
date: "[[2023-11-06]]"
|
|||
|
zero-link:
|
|||
|
- "[[00 Java разработка]]"
|
|||
|
parents:
|
|||
|
- "[[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`
|