Большинство разработчиков воспринимают сборку мусора (garbage collection) как нечто само собой разумеющееся. Это стандартный процесс, который периодически освобождает память, удаляя ненужные объекты. А вот американский программист Кен Фокс (Ken Fox) захотел досконально разобраться и заглянуть «под капот» современных сборщиков мусора.
Кен «поигрался» с пятью разными алгоритмами сборки мусора и опубликовал маленькие анимации, которые наглядно демонстрируют их работу.
Анимации большего размера выложены на github.com/kenfox/gc-viz.
Краткое пояснение по инфографике. Каждая картинка целиком — это память, выделенная для программы. Сначала она чёрная, то есть неиспользуемая, но постепенно начинается подсвечиваться ярко-жёлтым (операции записи) и ярко-зелёным (операции чтения). Со временем записанные фрагменты темнеют, чтобы показать развитие процесса во времени.
Можно заметить, что по ходу выполнения программа начинает игнорировать отдельные участки памяти. Они и считаются «мусором».
На первой анимации показано, как работает программа без сборщика мусора, то есть по методу очистки в конце. Самый простой способ: нужно дождаться окончания процесса, а потом очистить всё сразу. Это на удивление эффективная техника, пишет автор, если у вас есть способ разбить процесс на отдельные задачи. Так поступает, например, веб-сервер Apache.
Для контраста, вот как выглядит та же программа, но со сборщиком мусора, использующим технику подсчёта ссылок. Это ещё один относительно простой метод, когда подсчитывается количество ссылок на объект в памяти, и если оно падает до нуля, то объект удаляется.
Подсчёт ссылок — единственный алгоритм, хорошо совместимый с разными менеджерами ресурсов.
На анимации появились красные пикселы, которые соответствуют операции подсчёта ссылок. Можно оценить и эффективность сборщика, если сразу после красной вспышки область памяти освобождается.
В блоге автора и на его странице Github можно изучить также алгоритмы сборщиков типа Mark-Sweep, который решает проблему с обработкой циклических структур в памяти (анимация справа), Mark-Compact с перемещением объектов в памяти (анимация) и копирующего сборщика, который тоже перемещает объекты в памяти, но делает это более простым способом (анимация).
По теме:
Garbage Collection наглядно
Кен «поигрался» с пятью разными алгоритмами сборки мусора и опубликовал маленькие анимации, которые наглядно демонстрируют их работу.
Анимации большего размера выложены на github.com/kenfox/gc-viz.
![](https://habrastorage.org/files/fef/6a0/9e5/fef6a09e5cd84b5f86fd4628df96c42d.gif)
Можно заметить, что по ходу выполнения программа начинает игнорировать отдельные участки памяти. Они и считаются «мусором».
На первой анимации показано, как работает программа без сборщика мусора, то есть по методу очистки в конце. Самый простой способ: нужно дождаться окончания процесса, а потом очистить всё сразу. Это на удивление эффективная техника, пишет автор, если у вас есть способ разбить процесс на отдельные задачи. Так поступает, например, веб-сервер Apache.
![](https://habrastorage.org/files/38d/fe3/ad1/38dfe3ad11a54d18959057870c71be0c.gif)
Подсчёт ссылок — единственный алгоритм, хорошо совместимый с разными менеджерами ресурсов.
На анимации появились красные пикселы, которые соответствуют операции подсчёта ссылок. Можно оценить и эффективность сборщика, если сразу после красной вспышки область памяти освобождается.
![](https://habrastorage.org/files/ed7/3e5/906/ed73e5906109412e821fb881b38101ab.gif)
По теме:
Garbage Collection наглядно