--- 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.