digital-garden/knowledge/dev/java/gc/Serial GC.md
2024-06-13 21:01:37 +03:00

60 lines
3.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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