Главная » Java » Простая модель сборки мусора Java

0

 

   Процесс сборки мусора станет более очевиден, если для его иллюстрации ис пользовать простую и наглядную модель, — позже мы таковую и рассмотрим. Реальные  алгоритмы  и программы сборки  мусора,  разумеется,   намного более сложны и изощренны. Процесс сборки мусора можно логически разделить на две фазы — выявление живых (live) и мертвых (dead) объектов и удаление последних с высвобождением отведенной для них памяти. К живым объектам относятся те, которые достижимы (reachable) из какого-либо участка выполняемого кода, — они все еще могут быть востребованы в процессе выполнения программы. Мертвые же, не используемые, объекты — это мусор, подлежащий удалению.

  Одна очевидная модель сборки мусора связана с подсчетом ссылок (reference counting): когда объект X создает ссылку на объект У, система увеличивает счетчик ссылок объекта У на единицу; если же X упраздняет ссылку на У, значение счетчика уменьшается на единицу. Когда значение счетчика ссылок становится нулевым, У перестает быть живым объектом и может быть утилизирован — при этом уменьшаются значения счетчиков всех других объектов, на которые ссылался У.

  Схема подсчета ссылок, однако, не справляется с ситуацией, связанной с возникновением циклических (cycle) ссылок. Если объекты X и У ссылаются друг на друга, ни один из счетчиков ссылок не станет равным нулю и ни X, ни У не попадут в сферу действия сборщика мусора. В большинстве реальных программ сборки мусора модель подсчета ссылок не находит применения по этой и иным причинам.

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

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

   Любое изменение во взаимоотношениях объектов, вносимое прикладной программой в период выполнения маркирования и удаления, способно существенным образом повлиять на результаты работы сборщика мусора. Если к моменту начала маркирования объект относился к числу недостижимых, но до окончания  процесса присваивается какой-либо переменной, он все равно будет удален. Чтобы избежать подобных неприятностей, работу прикладной программы следует приостанавливать на время действия процесса сборки мусора — по меньшей мере, на период выполнения маркирования.

  Алгоритму маркирования и удаления присущи и другие изъяны. Сборка мусора — это сложная технологическая сфера, в которой нет простых и однозначных решений. Мы обратились к схеме маркирования и удаления как к простому ‘и удобному средству описания процессов сборки мусора. Каждая виртуальная машина следует собственной стратегии, а некоторые позволяют программисту выбирать подходы, удовлетворяющие конкретным условиям. Воспринимайте рассмотренную модель только как иллюстрацию — не следует полагать, что именно так действуют "настоящие" виртуальные машины Java.

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии