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

3.9 KiB
Raw Blame History

aliases tags date zero-link parents linked
Scavenge
зрелость/🌱
2023-11-06
../../../../garden/ru/meta/zero/00 Java разработка
../../../../garden/ru/dev/java/gc/Garbage Collector
Parallel GC
Concurrent Mark Sweep

Самая простая реализация сборщика, которая работает с одним потоком. Очень древний, появился еще в 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