Cтраница 2
В фазе маркирования, когда сборщик мусора находит ячейку типа memo table ( головная ячейка списка или корневая - для дерева), он маркирует ее, а затем сканирует мемо-таблицу. Для каждой ячейки мемо-таблицы он извлекает связанный с нею элемент ( представленный ячейкой типа entry, указываемой этой ячейкой) и исследует его аргумент. Если аргумент является атомом или уже маркирован, то и этот элемент, и его результат маркируются. [16]
Другая ситуация, в которой сборщик мусора может вызвать проблемы, связана с указателями. Концепция указателей предполагает явное управление памятью и вмешательство в этот процесс сборщика мусора крайне нежелательно. [17]
Первая фаза маркировки параллельного цикла сборщика мусора начинается с просмотра всех таких дескрипторов и переустановке их серых разрядов в белые, указывая этим, что все объекты, на которые ссылаются эти дескрипторы, будут потенциальным мусором, если вторая фаза маркировки обнаружит, что они являются недостижимыми. [18]
В традиционных системах выполнение алгоритма сборщика мусора с необходимостью исключает выполнение прикладных программ, которые ссылаются на доступный запас возвращенных блоков памяти. Это обстоятельство приводит к прерыванию прикладных программ в непредсказуемых точках в ситуациях, когда работа сборщика мусора становится необходимой. [19]
Мемо-таблицы и их элементы рассматриваются сборщиком мусора как ячейки особого вида. [20]
NET управление памятью осуществляется автоматически сборщиком мусора, и это в большинстве случаев освобождает программиста от забот о выделении и освобождении памяти. Сборщик мусора ( Garbage Collector) реализован в виде класса GC. CLR отслеживает ссылки на ту или иную переменную, и когда число ссылок становится равным нулю, помечает переменную как доступную для безопасного удаления и помещает ее в список подлежащих удалению. [21]
Рассмотрим вопрос о том, когда сборщик мусора уничтожает объекты. Ясно, что это происходит после того, как соответствующие объекты перестают быть доступными программе. Но происходит ли это сразу, или некоторое время спустя. Ответить на поставленный вопрос в общем случае невозможно. Для того чтобы повысить быстродействие программы, сборщик мусора стремится выполнять свою работу в то время, когда нагрузка на процессор со стороны выполняющихся программ падает. В общем случае, для нас не имеет значения, когда ненужные объекты будут уничтожены, однако в некоторых случаях это не так. [22]
Затем в рамках отдельного программного потока сборщик мусора выполняет метод Finalize каждого из объектов, после чего объект удаляется из списка. Когда объект удаляется из списка, последняя ссылка на него исчезает, в результате при последующем запуске сборщика мусора память, занимаемая объектом, освобождается. [23]
Предположим, например, что процесс - сборщик мусора активного пространства - обнаружил, что какой-то объект X нулевого уровня больше недостижим. Вместо того чтобы непосредственно послать АО для этого X как сообщение подсистеме управления памятью, указывающее, что пространство объекта X может быть теперь возвращено в систему, сборщик мусора вначале определяет ( опрашивая программно определяемый разряд в дескрипторе объекта X), существует ли в настоящее время версия X в пассивном пространстве. Если существует, то сообщение о пассивизации X посылается фильтру пассивизации. Предполагается, что процесс пас-сивизации, получающий X, имеет доступ к процедуре, указанной менеджером типа X, которая должна быть вызвана для выполнения над X требуемой операции пассивизации. [24]
Когда процессору требуется исполнить тип, удаленный сборщиком мусора из оперативной памяти, генерируется запрос на получение типа от ЛТ-компилятора. С целью оптимизации циклы исполнения, ЛТ-компиляции и разрешения типов минимизированы. Именно эти циклы приводят к снижению скорости выполнения приложения. Для небольшой программы это не является проблемой. Все ее компоненты легко умещаются в памяти, так что время на сборку мусора вообще не тратится. В случае больших программ необходимо уничтожать неиспользуемые объекты, как только они становятся ненужными. Это позволяет избежать нехватки памяти и хранить в памяти первоначально работающий набор программных компонентов. [25]
Этот процесс может быть либо прерывистым, либо постоянным: прерывающий сборщик мусора требует приостановки процесса пользователя, а непрерывный сборщик позволяет вести эти процессы параллельно. По понятным причинам первый назван старт / стоп сборщиком, а второй - параллельным сборщиком, или сборщиком реального времени. [26]
На самом же деле, как мы увидим, модификация сборщика мусора, необходимая для корректной обработки им элементов мемо-таблиц и их результатов, не является чрезмерно сложной. [27]
Остальные байты, использовавшиеся в локальных и глобальных объектах, обрабатываются сборщиком мусора. [28]
Вершина, отмеченная, становится несвязанной и может быть устранена с помощью сборщика мусора, поскольку не является разделяемой. [29]
Если же в куче недостаточно места для хранения кортежа, то инициируется сборщик сборщик мусора для повторного использования пространства кучи ( см. гл. [30]