60 lines
3.8 KiB
Markdown
60 lines
3.8 KiB
Markdown
---
|
||
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` |