59 lines
4.1 KiB
Markdown
59 lines
4.1 KiB
Markdown
|
---
|
|||
|
aliases:
|
|||
|
tags:
|
|||
|
- зрелость/🌱
|
|||
|
date: "[[2023-11-07]]"
|
|||
|
zero-link:
|
|||
|
- "[[00 Java разработка]]"
|
|||
|
parents:
|
|||
|
- "[[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.
|