В простой терминологии, как работает механизм сбора мусора?
Как идентифицируется объект для сбора мусора?
Кроме того, что означает Reference Counting, Mark and Sweep, Copying, Train
в алгоритмах GC?
В простой терминологии, как работает механизм сбора мусора?
Как идентифицируется объект для сбора мусора?
Кроме того, что означает Reference Counting, Mark and Sweep, Copying, Train
в алгоритмах GC?
Когда вы используете язык с сборкой мусора, вы не получите доступ непосредственно к памяти. Скорее вам предоставляется доступ к некоторой абстракции поверх этих данных. Одной из вещей, которые должным образом отвлечены, является фактическое местоположение в памяти блока данных, а также указатели на другие блоки данных. Когда сборщик мусора запускается (иногда это происходит), он проверяет, сохраняете ли вы все ссылки на каждый из блоков памяти, которые он выделил для вас. Если вы этого не сделаете, это освободит эту память.
Основное различие между различными типами сборщиков мусора - их эффективность, а также любые ограничения в отношении того, какие схемы распределения они могут обрабатывать.
Простейшим является правильный подсчет ссылок. Когда вы создаете ссылку на объект, внутренний счетчик на этом объекте увеличивается, когда вы теряете ссылку или больше не в области, счетчик на (предыдущем) целевом объекте уменьшается. Когда этот счетчик достигает нуля, объект больше не передается и может быть освобожден.
Проблема с подсчетом подсчета сборщиков мусора заключается в том, что они не могут обрабатывать циклические данные. Если объект A имеет ссылку на объект B и который, в свою очередь, имеет некоторую (прямую или косвенную) ссылку на объект A, они никогда не могут быть освобождены, даже если ни один из объектов в цепочке не встречается вне цепочки (и поэтому aren ' t доступно для программы вообще).
Алгоритм Mark и sweep, с другой стороны, может справиться с этим. Алгоритм маркировки и развертки работает, периодически останавливая выполнение программы, отмечая каждый элемент, который программа выделила как недоступный. Затем программа проходит через все переменные, которые программа имеет, и отмечает, на что они указывают, как достижимые. Если какое-либо из этих распределений содержит ссылки на другие данные в программе, эти данные затем также обозначаются как достижимые и т.д.
Это часть метки алгоритма. В этот момент все программы могут получить доступ, независимо от того, как косвенно, отмечены как достижимые, и все, что программа не может достичь, отмечена как недостижимая. Теперь сборщик мусора может безопасно восстановить память, связанную с объектами, отмеченными как недоступные.
Проблема с алгоритмом метки и развертки заключается в том, что она не настолько эффективна - вся программа должна быть остановлена для ее запуска, и многие ссылки на объекты не будут меняться.
Чтобы улучшить это, алгоритм метки и развертки может быть расширен с помощью так называемой "сборной мусора". В этом режиме объекты, которые были в системе для некоторого количества сборщиков мусора, продвигаются в прежнее поколение, что часто не проверяется.
Это повышает эффективность, потому что объекты, как правило, умирают молодыми (думайте о том, что строка изменяется внутри цикла, что может привести к жизни в течение нескольких сотен циклов) или жить очень долго (объекты, используемые для представления основного окна приложения, или соединение с базой данных сервлета).
Более подробная информация содержится в википедии.
Добавлен на основе комментариев:
С помощью алгоритма метки и развертки (а также любого другого алгоритма сбора мусора, кроме подсчета ссылок) сбор мусора не запускается в контексте вашей программы, так как он должен иметь доступ к материалам, которые ваша программа не способна доступа непосредственно. Поэтому неправильно говорить, что сборщик мусора работает в стеке.
Сборщик мусора для CLR описан в этом slidedeck. "Корни" на слайде 15 являются источниками для объектов, которые сначала идут на график. Их поля-члены и т.д. Используются для поиска других объектов на графике.
Wikipedia описывает некоторые из этих подходов гораздо более и более подробно.
Сбор мусора - это просто знать, есть ли какая-либо будущая потребность в переменных в вашей программе, а если нет, собирайте и удаляйте их.
Акцент делается на слове Garbage, то, что полностью используется в вашем доме, бросается в мусор, и мусорщик обрабатывает его для вас, придя, чтобы забрать его и забрать дайте вам больше места в мусорном баке вашего дома.
Подсчет ссылок, маркировка и развертка, копирование, поезд и т.д. подробно обсуждаются на Часто задаваемые вопросы по GC
Общий способ заключается в том, что количество ссылок на объект отслеживается в фоновом режиме, и когда это число обращается в нуль, объект SUBJECT TO сборка мусора, однако GC не запускается до тех пор, пока это явно необходимо, потому что это дорогостоящая операция. Что происходит, когда он начинается, так это то, что GC проходит через управляемую область памяти и находит каждый объект, у которого нет ссылок. Gc удаляет эти объекты, сначала называя их деструкторы, позволяя им очищаться после себя, а затем освобождает память. Обычно GC затем сжимает область управляемой памяти, перемещая каждый выживший объект в одну область памяти, позволяя делать больше распределений.
Как я уже сказал, это один из методов, который я знаю, и в этой области проводится много исследований.
Сбор мусора - большая тема, и есть много способов ее реализовать.
Но для наиболее распространенных в двух словах сборщик мусора ведет запись всех ссылок на что-либо, созданное с помощью оператора new
, даже если это использование оператора было скрыто от вас (например, в методе Type.Create()
). Каждый раз, когда вы добавляете новую ссылку на объект, корень этой ссылки определяется и добавляется в список, если это необходимо. Ссылка удаляется всякий раз, когда она выходит за рамки.
Когда больше нет ссылок на объект, он может (не "будет" ) собираться. Чтобы повысить производительность и убедиться, что необходимая очистка выполнена правильно, коллекции собраны для нескольких объектов одновременно и происходят в течение нескольких поколений.