digital-garden/knowledge/dev/java/gc/Concurrent Collection.md

59 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:
tags:
- зрелость/🌱
date: "[[2023-11-07]]"
zero-link:
- "[[../../../../garden/ru/meta/zero/00 Java разработка]]"
parents:
- "[[../../../../garden/ru/dev/java/gc/Garbage Collector]]"
linked:
---
Этот алгоритм пытается собирать мусор в то же время, когда работает приложение, чтобы уменьшить влияние сбора мусора на производительность приложения.
## Marking
В этом и заключается проблема: приложение активно используется, а значит намного сложнее определять живые/мертвые объекта, а еще сложнее эвакуировать, то есть переносить эти объекты.
Мы начали обходить граф, и в момент обхода ссылка из серого объекта пропала, а в черном (который мы уже посетили), ссылка появилась.
![](Pasted%20image%2020231108141633.png)
Есть 2 решения, которые позволяют решить эту проблему. Оба решения перехватывают запись.
- [Incremental Update (IU)](Incremental%20Update%20(IU).md)
- [Snapshot at the beginning (SATB)](Snapshot%20at%20the%20beginning%20(SATB).md)
Обычно при таком подходе мы имеем 2 паузы:
- **Init Mark**. Скорость зависит от размера Root Set.
- Остановить мутатор, чтобы избежать состояния гонки
- Покрасить весь Root Set в черный
- Взвести [SATB](Snapshot%20at%20the%20beginning%20(SATB).md)/[Incremental Update (IU)](Incremental%20Update%20(IU).md) барьеры в готовность
- **Final Mark**. Скорость зависит от размера Root Set и длины очередей.
- Остановить мутатор, чтобы избежать состояния гонки
- Слить остатки из [SATB](Snapshot%20at%20the%20beginning%20(SATB).md)/[Incremental Update (IU)](Incremental%20Update%20(IU).md) очередей
- Доделать маркировку из этих остатков и изменений в root set-е.
Наблюдения Алексия Шипелева:
- Хорошо сделанный [StopTheWorld](StopTheWorld.md) GC побьет хорошо сделанный Concurrent GC по пропускной способности
- Даже если GC не работает, вы платите за [барьеры](Барьеры%20в%20программировании.md).
## [Copy Collector](Copy%20Collector.md)
В отличие от [StopTheWorld](StopTheWorld.md) здесь возникают проблемы. Теперь мы пытаемся переносить объекты во время работы приложения, а значит приложение может "застать нас врасплох", когда мы будем в процессе переноса объекта.
![](Pasted%20image%2020231108164235.png)
Здесь нам помогают Brooks pointers, дополнительное перенаправление.
![](Pasted%20image%2020231108164343.png)
![](Pasted%20image%2020231108164414.png)
![](Pasted%20image%2020231108164430.png)
![](Pasted%20image%2020231108164445.png)
![](Pasted%20image%2020231108164517.png)
![](Pasted%20image%2020231108164501.png)
![](Pasted%20image%2020231108165010.png)
![](Pasted%20image%2020231108165036.png)
## Выводы
**Минусы:**
- Необходимо поддерживать постоянную консистентность heap, так как приложение может обратиться к данным в любой момент времени. Для этого обычно используются [барьеры](Барьеры%20в%20программировании.md), которые оказывают влияние на производительность приложения.
- Ресурсы железа уходят на работу GC.