3.9 KiB
aliases | tags | date | zero-link | parents | linked | ||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
|
2023-11-06 |
|
|
|
Самая простая реализация сборщика, которая работает с одним потоком. Очень древний, появился еще в Java 1.
Алгоритм работы
Здесь используется подход Generational Collection, то есть область памяти делится на две части: Young Generation и Old Generation. Область памяти Young Generation в свою очередь, разделена на две части: Eden и Survivor. Survior также разделена на 2 части (From, To). Тут на начальном этапе постепенно заполняются области памяти – Eden, From.
Для молодого поколения используется алгоритм Copy Collector. После того, как Eden заполнился, происходят следующее шаги:
- приложение приостанавливается для начала сборки мусора, StopTheWorld
- «живые» объекты из Eden перемещаются в область памяти «To»;
- «живые» объекты из «From» перемещаются в «To» или в «old generation», если они достаточно «старые»;
- Eden и «From» очищаются от мусора;
- «To» и «From» меняются местами;
- приложение возобновляет работу.
Память, где находятся мертвые объекты (помечены крестиком), будет помечена доступной для использования. Физической очистки этих областей не происходит, новые объекты будут записываться поверх старых данных.
В результате сборки мусора картинка области памяти изменится и будет выглядеть следующим образом:
Для Old Generation используется алгоритм Mark and Compact.
Иллюстрация StopTheWorld. Зеленые линии это потоки приложения, красные это потоки GC.
Плюсы:
- Минимальное потребление ресусов.
- Линейная аллокация объектов. Благодаря использованию Mark and Compact.
Минусы:
- Вся работа выполняется с остановками приложения и из-за однопоточности довольно большие паузы StopTheWorld (0,5 - 1 c).
- Последовательная сборка молодого и старого поколений.
Где можно использовать:
- Консольное приложение
- Одноядерные системы с ограничением в ОЗУ и CPU
- Бизнес логика занимает десятки минут.
Где не стоит использовать:
- Системы реального времени
- Web-приложения
Как включить:
-XX:+UseSerialGC