Главная » Java » Сборка мусора Java механизм работы

0

 

  Объекты создаются посредством оператора new, но в языке Java нет соответствующего оператора, подобного delete в C++, который предназначен для принудительного удаления ранее созданных объектов и освобождения занимаемой ими памяти. Закончив работу с объектом, вы просто перестаете на него ссылаться — достаточно присвоить переменной ссылку на другой объект или значение null либо прекратить выполнение метода, чтобы его локальные переменные завершили свое существование естественным образом. Объекты, ссылки на которые отсутствуют, принято называть мусором (garbage), а процесс отыскания и уничтожения таких объектов — сборкой мусора (garbage collection).

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

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

   Наличие сборщика мусора означает, что программисту не нужно заботиться о том, как избежать появления висящих ссылок (dangling references). В системах, где программа осуществляет прямой контроль над процессами удаления объектов, вполне возможно удалить объект, когда ссылки на него все еще существуют. Такие ссылки становятся "висящими" в том смысле, что они указывают на те участки памяти, которые трактуются системой как свободные. Подобные участки, которые, "по мнению" системы, свободны, могут быть отведены ею для новых объектов, и старые, "висящие", ссылки теперь будут указывать на совершенно иные объекты, не имеющие никакого отношения к прежним. Такая ситуация грозит хаосом и способна привести программу к полному краху. Сборщик мусора решает эту проблему: объект, какие-либо ссылки на который существуют, никогда не будет расценен как "мусор" и удален, и поэтому занимаемый им фрагмент памяти не будет воспринят системой как свободный. Сборщик мусора позволяет избежать и опасности случайного многократного удаления одного и того же объекта, что также может грозить серьезными неприятностями.

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

   Наличие механизма сборки мусора отнюдь не означает, что для создания новых объектов памяти хватит при любых обстоятельствах: можно строить объекты, помещать их в список и делать это до тех пор, пока свободная память не будет исчерпана, а сборщик мусора так и не примется за работу, поскольку все объекты обладают ссылками. Речь идет о своеобразной утечке памяти (memory leak) (здесь мы употребляем этот термин в ином смысле, отличном от традиционного, принятого, скажем, в языках С и C++ и связанного с присваиванием ссылочной переменной другого значения и потерей связи между нею и исходным объектом — удалением таких объектов в Java как раз и занимается сборщик мусора): мы храним в списке большое число ссылок на объекты, которые нам уже не нужны. Сборщик мусора решает многие проблемы распределения памяти, но, увы, не все.

 

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

По теме:

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