Как работает механизм сборки мусора?

В терминологии непрофессионала, как работает механизм сборки мусора?

Как определить доступность объекта для сборки мусора?

Кроме того, что означает Reference Counting, Mark and Sweep, Copying, Train в алгоритмах сборки мусора?


person S M Kamran    schedule 21.04.2009    source источник
comment
Нет ... это не так. Наверное, это просто потому, что я так выразился. В любом случае   -  person S M Kamran    schedule 22.04.2009
comment
Я бы порекомендовал прочитать довольно хорошую 34-страничную иллюстрированную статью Однопроцессорные методы сборки мусора, автор Пол Р. Уилсон (1992), в котором объясняются концепции, лежащие в основе основных методов сборки мусора (подсчет ссылок, отметка и очистка, отметка- компактный, инкрементальный, поколенческий).   -  person stakx - no longer contributing    schedule 16.06.2012


Ответы (5)


Когда вы используете язык со сборкой мусора, вы не получаете прямого доступа к памяти. Скорее вам предоставляется доступ к некоторой абстракции поверх этих данных. Одна из вещей, которая должным образом абстрагируется, - это фактическое расположение блока данных в памяти, а также указатели на другие блоки данных. Когда сборщик мусора запускается (это случается иногда), он проверяет, есть ли у вас ссылка на каждый из блоков памяти, которые он для вас выделил. Если вы этого не сделаете, это освободит память.

Основное различие между разными типами сборщиков мусора заключается в их эффективности, а также в любых ограничениях на то, какие схемы распределения они могут обрабатывать.

Самый простой - это правильный подсчет ссылок. Когда вы когда-либо создаете ссылку на объект, внутренний счетчик этого объекта увеличивается, когда вы случайно указываете ссылку или она больше не находится в области видимости, счетчик на (бывшем) целевом объекте уменьшается. Когда этот счетчик достигает нуля, объект больше не упоминается и может быть освобожден.

Проблема со сборщиками мусора с подсчетом ссылок заключается в том, что они не могут работать с циклическими данными. Если объект A имеет ссылку на объект B и, в свою очередь, имеет некоторую (прямую или косвенную) ссылку на объект A, они никогда не могут быть освобождены, даже если ни один из объектов в цепочке не упоминается вне цепочки (и, следовательно, не т доступны программе вообще).

С другой стороны, алгоритм Mark and sweep может справиться с этим. Алгоритм отметки и очистки работает, периодически останавливая выполнение программы, отмечая каждый элемент, выделенный программой, как недостижимый. Затем программа просматривает все переменные, которые есть в программе, и отмечает, на что они указывают, как достижимые. Если какое-либо из этих выделений содержит ссылки на другие данные в программе, эти данные также помечаются как достижимые и т. Д.

Это отметка в алгоритме. На этом этапе все, к которому программа может получить доступ, независимо от того, насколько косвенно, помечено как достижимое, а все, что программа не может достичь, помечено как недостижимое. Сборщик мусора теперь может безопасно освободить память, связанную с объектами, отмеченными как недоступные.

Проблема с алгоритмом метки и очистки заключается в том, что он не так эффективен - всю программу нужно остановить, чтобы запустить ее, и многие ссылки на объекты не изменятся.

Чтобы улучшить это, алгоритм метки и очистки может быть расширен за счет так называемой «генеральной сборки мусора». В этом режиме объекты, которые были в системе для некоторого количества сборок мусора, переводятся в старое поколение, которое не так часто проверяется.

Это повышает эффективность, потому что объекты, как правило, умирают молодыми (представьте, что строка изменяется внутри цикла, в результате чего, возможно, время жизни составляет несколько сотен циклов) или живут очень долго (объекты, используемые для представления главного окна приложения или подключение сервлета к базе данных).

Более подробную информацию можно найти в Википедии.

Добавлено на основе комментариев:

С помощью алгоритма отметки и очистки (а также любого другого алгоритма сборки мусора, кроме подсчета ссылок) сборка мусора не выполняется в контексте вашей программы, поскольку она должна иметь доступ к материалам, которые вы используете. программа не может получить доступ напрямую. Поэтому неправильно говорить, что сборщик мусора работает в стеке.

person tomjen    schedule 21.04.2009
comment
Понятно, легко и кратко. Вы сказали здесь один вопрос о mark and sweep, который проверяет все переменные в вашей программе. Если я не ошибаюсь, ссылки существуют в стеке и объект в куче, то как мы можем связать этот процесс сборки мусора в куче. - person S M Kamran; 22.04.2009

  • Подсчет ссылок - у каждого объекта есть счетчик, который увеличивается, когда кто-то берет ссылку на объект, и уменьшается, когда кто-то освобождает ссылку. Когда счетчик ссылок становится равным нулю, объект удаляется. COM использует этот подход.
  • Отметить и развернуть - у каждого объекта есть флажок, если он используется. Начиная с корня графа объектов (глобальные переменные, локальные переменные в стеках и т. Д.), Каждый объект, на который имеется ссылка, получает свой флаг, и так далее по цепочке. В конце все объекты, на которые нет ссылок на графике, удаляются.

Сборщик мусора для CLR описан в этой слайд-шоу. «Корни» на слайде 15 - это источники объектов, которые первыми попадают на график. Их поля-члены и т. Д. Используются для поиска других объектов на графике.

Википедия описывает некоторые из этих подходов гораздо более подробно и более подробно.

person Michael    schedule 21.04.2009
comment
Я просмотрел википедию ... на самом деле меня беспокоит то, как Object Graph обслуживается и проходит через процедуру сборки мусора. - person S M Kamran; 22.04.2009
comment
Обновил мой ответ с 10k представлением о построении графа объектов. - person Michael; 22.04.2009

Сборка мусора - это просто знание о том, понадобятся ли в вашей программе какие-либо переменные в будущем, а если нет, собирайте и удаляйте их.

Акцент делается на слове Мусор: то, что полностью использовалось в вашем доме, выбрасывается в мусор, и мусорщик обрабатывает его за вас, приходя, чтобы забрать его и забрать, чтобы дать вам больше комната в вашем доме мусорное ведро.

Подсчет ссылок, отметка и поиск, копирование, обучение и т. Д. Подробно обсуждаются в FAQ по GC.

person TStamper    schedule 21.04.2009

Обычно это делается так, что количество ссылок на объект отслеживается в фоновом режиме, и когда это число становится равным нулю, объект является СУБЪЕКТАМ для сборки мусора, однако сборщик мусора не запускается, пока он не будет явно необходимо, потому что это дорогостоящая операция. Когда он запускается, сборщик мусора проходит через управляемую область памяти и находит все объекты, на которые не осталось ссылок. Gc удаляет эти объекты, сначала вызывая их деструкторы, позволяя им убирать за собой, а затем освобождает память. Обычно сборщик мусора затем сжимает управляемую область памяти, перемещая каждый уцелевший объект в одну область памяти, что позволяет разместить больше выделений.

Как я уже сказал, это один из известных мне методов, и в этой области проводится много исследований.

person Scott M.    schedule 21.04.2009

Сборка мусора - большая тема, и есть много способов ее реализовать. .

Но для наиболее распространенных вкратце сборщик мусора ведет учет всех ссылок на все, что создано с помощью оператора new, даже если использование этого оператора было скрыто от вас (например, в методе Type.Create()). Каждый раз, когда вы добавляете новую ссылку на объект, корень этой ссылки определяется и при необходимости добавляется в список. Ссылка удаляется всякий раз, когда выходит за рамки.

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

person Joel Coehoorn    schedule 21.04.2009