--- aliases: - Scavenge tags: - зрелость/🌱 date: "[[2023-11-06]]" zero-link: - "[[00 Java разработка]]" parents: - "[[Garbage Collector]]" linked: - "[[Parallel GC]]" - "[[Concurrent Mark Sweep|Concurrent Mark Sweep]]" --- Самая простая реализация сборщика, которая работает с одним потоком. Очень древний, появился еще в [Java 1](Java%201.md). ## Алгоритм работы Здесь используется подход [Generational Collection](Generational%20Collection.md), то есть область памяти делится на две части: Young Generation и Old Generation. Область памяти Young Generation в свою очередь, разделена на две части: Eden и Survivor. Survior также разделена на 2 части (From, To). Тут на начальном этапе постепенно заполняются области памяти – Eden, From. ![](Pasted%20image%2020231107092536.png) Для молодого поколения используется алгоритм [Copy Collector](Copy%20Collector.md). После того, как Eden заполнился, происходят следующее шаги: - приложение приостанавливается для начала сборки мусора, [StopTheWorld](StopTheWorld.md) - «живые» объекты из Eden перемещаются в область памяти «To»; - «живые» объекты из «From» перемещаются в «To» или в «old generation», если они достаточно «старые»; - Eden и «From» очищаются от мусора; - «To» и «From» меняются местами; - приложение возобновляет работу. ![](Pasted%20image%2020231107092628.png) Память, где находятся мертвые объекты (помечены крестиком), будет помечена доступной для использования. Физической очистки этих областей не происходит, новые объекты будут записываться поверх старых данных. В результате сборки мусора картинка области памяти изменится и будет выглядеть следующим образом: ![](Pasted%20image%2020231107092809.png) Для Old Generation используется алгоритм [Mark and Compact](Mark%20and%20Compact.md). Иллюстрация [StopTheWorld](StopTheWorld.md). Зеленые линии это потоки приложения, красные это потоки GC. ![](Pasted%20image%2020231107214434.png) **Плюсы:** - Минимальное потребление ресусов. - Линейная [аллокация](Аллокация.md) объектов. Благодаря использованию [Mark and Compact](Mark%20and%20Compact.md). **Минусы:** - Вся работа выполняется с остановками приложения и из-за однопоточности довольно большие паузы [StopTheWorld](StopTheWorld.md) (0,5 - 1 c). - Последовательная сборка молодого и старого поколений. **Где можно использовать:** - Консольное приложение - Одноядерные системы с ограничением в ОЗУ и CPU - Бизнес логика занимает десятки минут. **Где не стоит использовать:** - Системы реального времени - Web-приложения **Как включить:** - `-XX:+UseSerialGC`