digital-garden/knowledge/dev/java/gc/Serial GC.md

60 lines
3.8 KiB
Markdown
Raw Normal View History

2024-06-13 21:01:37 +03:00
---
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`