2009-04-21 3 views
21

В терминологии, касающейся человека, как работает механизм сбора мусора?Как работает механизм сбора мусора?

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

Также, что делает Reference Counting, Mark and Sweep, Copying, Train в алгоритмах GC?

+4

Nopes ... его нет. Наверное, кажется, это так, как я выразился. Любые способы –

+1

Я бы рекомендовал прочитать неплохую 34-страничную иллюстрированную бумагу, [* Uniprocessor Garbage Collection Techniques *, автор Paul R. Wilson (1992)] (http://www.cse.nd.edu/~dthain /courses/cse40243/spring2006/gc-survey.pdf), в котором объясняются концепции основных методов сбора мусора (подсчет ссылок, маркировка и разметка, метка-компактность, инкрементное, поколение). – stakx

ответ

29

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

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

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

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

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

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

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

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

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

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

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

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

+3

Прозрачный, легкий и короткий. Один вопрос здесь, вы сказали о знаке и развертке, что он проверяет все переменные в вашей программе. Если я не ошибаюсь, существует ссылка на стек и объект в куче, то как мы можем связать этот процесс GC в Heap. –

3

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

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

подсчет ссылок, Марк и стреловидность, копирование, поезд и т.д., обсуждаются в хорошей подробно GC FAQ

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

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

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

+0

Я прошел через википедию. На самом деле меня беспокоит Object Graph, как он поддерживается и проходит через программу GC. –

+0

Обновлен мой ответ с представлением 10k построения графа объектов. – Michael

0

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

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

0

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

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

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

Смежные вопросы