Cтраница 1
Сборка мусора, когда она инициируется программно или системой, начинается с просмотра всех объектов, размещенных в памяти, и проверки числа ссылок на них. Число ссылок на объект уменьшается, если ему явно присваивается значение nil. Ссылки на локальные объекты, создававшиеся в функциях и процедурах, обнуляются, если объект вышел из области видимости или выполнение функции закончилось. Надо учесть, что сборщик учитывает только ссылки, имеющиеся в управляемом коде. Если сборка содержит также неуправляемый код ( API Win32, DLL, методы, работающие с объектами СОМ), то ссылки, имеющиеся в нем, не учитываются. В этом случае сборщик мусора может удалить объект, который используется неуправляемым кодом. [1]
Операция сборки мусора и реализующая ее программа используются только при переполнении объемов памяти, отводимых под каталог и хранилище. Эта операция требует значительных ресурсов времени и памяти ЭВМ, поэтому целесообразность проведения ее в процессе формирования математических моделей непроизводных и составных фигур представляется сомнительной. [2]
Механизм сборки мусора хорошо знаком Java-программистам. NET сборка мусора организована почти так же, как и в Java. Для тех, кто не знаком с термином сборка мусора, следует пояснить, что под ним понимается автоматическое высвобождение ранее выделенной неиспользуемой памяти. NET - сборщик мусора - следит за выделением памяти и высвобождает ее, когда содержащиеся в ней объекты уже не используются программой. Как же сборщик мусора определяет, в какой момент объект становится ненужным. Сборщик мусора удаляет объект из памяти, например, когда ссылка на этот объект выходит из области видимости ( скажем, при выходе из процедуры), или когда ссылке, прежде указывавшей на один объект, присваивается другое значение. [3]
![]() |
Организация кучи в виде двух подпространств. [4] |
При сборке мусора сборщик проходит по словам состояния и находит ссылки на активные ячейки. Однако вместо простого маркирования их, как в сканирующем сборщике, содержимое этих ячеек физически переносится в другую область. При этом текущая область называется FROMSPACE, а другая - TOSPACE. Здесь требуется второй указатель ( Т) для адресации верхнего слова в TOSPACE; перед началом цикла копирования он приравнивается к NEXTBASE и увеличивается каждый раз, когда новое слово заносится в TOSPACE. При этом первое слово в старой копии каждой ячейки и величина исходного указателя на каждую перемещенную ячейку изменяются так, чтобы указывать теперь на новое положение ячейки в TOSPACE. Адрес, хранящийся теперь перед началом старой копии ячейки, называется ведущим адресом, или невидимым указателем, и используется для изменения всех ссылок на эту ячейку, которые могут встретиться. [5]
Хотя теперь сборка мусора будет происходить в ленивом режиме, не исключено, что в стеке может скапливаться большое число адресов ячеек, чьи счетчики ссылок больше единицы. Другими словами, большинство ячеек не являются разделяемыми. [6]
Наличие механизма сборки мусора может серьезно повлиять на стиль программирования. NET мы можем сказать, что память всегда высвобождается вне области видимости фрагмента, в котором она была выделена. Это позволяет прибегнуть к конструкциям программирования, вряд ли допустимым в иных условиях. [7]
В целях оптимизации сборка мусора выполняется только тогда, когда возникает ошибка страницы памяти. Таким образом, работающий в памяти код остается там до тех пор, пока нехватка памяти не активизирует процесс сборки мусора. Это приводит к увеличению скорости выполнения приложения. [8]
И наконец, сборка мусора в очень большом массиве может занимать значительное время, особенно если сканирование массива заставляет программу обращаться к файлам подкачки. Это может вызвать остановку программы на несколько секунд, пока не очистится память. [9]
Когда выполняется процедура сборки мусора, используемые элементы перемещаются из конца списка в начало, заполняя пространство, которое занимали помеченные элементы. Это означает, что позиции элементов в списке могут измениться во время этой операции. Если другие части программы обращаются к элементам списка по их исходным позициям, то необходимо модифицировать процедуру сборки мусора так, чтобы она обновляла ссылки на положение элементов в списке. Подобные преобразования достаточно сложны и затрудняют сопровождение программ. [10]
Среди программистов использование механизма сборки мусора ( Garbage Collector, GC) является темой многочисленных споров. Большинство программистов довольны тем, что GC помогает им существенно снизить вероятность возникновения ошибок управления памятью. [11]
Программа Gaibage демонстрирует метод сборки мусора. [12]
Это означает, что при сборке мусора из области FROMSPACE в TOSPACE было передвинуто N ячеек и N / k ячеек ( округленно до большего целого) было заново создано процессом пользователя: заметьте, что размещение каждой новой ячейки вызывает перемещение k активных ячеек в TOSPACE. Это требует, чтобы объем одной области был N - j - N / k ячеек, а всей кучи 2N ( I - j - 1 / k) ячеек. С увеличением k эта величина уменьшается. [13]
Процесс iMAX GCOL выполняет алгоритм Дейкстры Сборка мусора по ходу дела [18] параллельно с большинством других процессов iMAX, а также параллельно со всеми процессами пользователей. В данном разделе мы дадим краткий обзор алгоритма и архитектурной поддержки iMAX, на которой базируется работа этого алгоритма. Полное описание действующей реализации этого алгоритма выходит за пределы тем, рассматриваемых в данной книге. [14]
![]() |
Перемещение ячейки. [15] |