Пора выносить мусор! Возможно, вы знакомы с термином «сборка мусора» как атрибутом языка программирования. В некоторых языках он есть, в некоторых - нет. Это можно считать удобством или помехой в зависимости от ваших индивидуальных потребностей.

Сборка мусора - это функция относительно новых языков программирования. Он занимается распределением памяти. Когда вы храните что-то в переменной, ему назначается место в памяти вашего компьютера или памяти виртуальной машины вашего языка программирования в случае некоторых языков более высокого уровня. Там он будет оставаться до тех пор, пока вы не укажете своей программе удалить его из памяти, удалив переменную. Во многих случаях это не имеет большого значения, но для больших приложений память может быстро заполниться, если вы не будете осторожны, что приведет к снижению производительности. Здесь на помощь приходит сборка мусора. Язык со сборкой мусора автоматически удаляет объекты из памяти, когда считает, что они больше не используются. Довольно мило! Теперь вам не нужно отслеживать элементы, занимающие место в вашей памяти. Однако это не всегда желательно.

Что такое мусор?

Объекты, хранящиеся в памяти, делятся на две категории: на которые есть ссылки и на которые нет ссылок. «Ссылка» означает, что она в настоящее время используется какой-либо частью вашей программы, а «не указанная» означает, что в настоящее время нет частей вашей программы, указывающих на этот элемент, хранящийся в памяти. Сборщик мусора просматривает каждый объект, хранящийся в памяти, чтобы узнать, есть ли на него ссылка или нет. Любые объекты, на которые нет ссылок, являются мусором, и они удаляются!

Типы GC

Есть много алгоритмов, которые можно использовать при сборке мусора, но я коснусь лишь некоторых.

Отметить и развернуть

Сборщик мусора mark and sweep сканирует память и маркирует каждый объект, который в данный момент используется программой. Затем он снова сканирует, удаляя (подметая) объекты, на которые нет ссылок.

Mark and Sweep был первым проектом сборки мусора. Сегодня он не получил широкого распространения, поскольку требует остановки всех других системных процессов во время работы, что делает его непрактичным и требует много времени.

Подсчет ссылок

Сборщик мусора с подсчетом ссылок назначает счетчик каждому блоку памяти, который будет подсчитывать каждый раз, когда добавляется ссылка, и вести обратный отсчет всякий раз, когда ссылка удаляется. Если счетчик равен 0, блок памяти освобождается. При подсчете ссылок программе не нужно останавливаться, чтобы выполнить сборку мусора, потому что это происходит в реальном времени всякий раз, когда счетчик достигает 0. Недостатком подсчета ссылок является частота, с которой он освобождает память, что может снизить производительность. . Perl, PHP и Python - это примеры языков, использующих сборку мусора с подсчетом ссылок.

Отслеживание

Сборка мусора трассировки идентифицирует объект, на который имеется ссылка, а затем отслеживает все остальные связанные с ним объекты. Таким образом определяется «достижимость» объекта. Объекты, на которые не указывают ссылки, «недоступны» и удаляются сборщиком мусора. В приведенной ниже анимации используется трехцветная маркировка, чтобы показать, как работает трассировка. В этом примере все объекты начинаются с белого цвета. Объекты корневого набора (те, которые определенно используются) окрашены в серый цвет. Любой объект, на который ссылается серый объект, также окрашивается в серый цвет. Когда ничто другое не может быть окрашено в серый цвет, все серые объекты окрашиваются в черный цвет. Черные объекты считаются указанными и остаются. Белые объекты считаются мусором и удаляются.

Трассировка - это наиболее часто используемая форма сборки мусора. Среди других языков он используется в Java и C #.

Собирать или не собирать

Большинство языков высокого уровня, таких как Java, Ruby, C # и Go, имеют встроенный сборщик мусора, который автоматически обнаруживает и уничтожает неиспользуемые объекты памяти. Это избавляет программиста от необходимости выполнять всю эту работу самостоятельно. Они могут отдыхать спокойно, зная, что их приложение не выйдет из строя из-за нехватки памяти из-за объектов, на которые нет ссылок.

Некоторые языки, такие как C и C ++, не имеют автоматической сборки мусора. Почему? Разработчики этих языков стремятся сосредоточиться на эффективности и поэтому избегают любых автоматических функций. Сбор мусора требует времени и может привести к нежелательному снижению производительности. Выделение и освобождение памяти вручную требует меньше ресурсов, чем запуск сборщика мусора, хотя от программиста требуется больше времени и внимания. Надо сказать, что сборщики мусора вроде могут быть добавлены в C и C ++ в виде библиотеки.

Сборщики мусора творит чудеса в фоновом режиме, и в большинстве случаев вы этого даже не заметите. Если ручное выделение памяти является обязательным для вашего проекта, возможно, лучше всего попробовать языки без коллекторов, такие как C или C ++!