«Остров изоляции» Сборщика мусора - PullRequest
46 голосов
/ 27 апреля 2009

Может ли кто-нибудь объяснить, что такое Остров изоляции Сборщика мусора?

Ответы [ 4 ]

44 голосов
/ 27 апреля 2009

Объект A ссылается на объект B. Объект B ссылается на объект A. Ни на объект A, ни на объект B не ссылаются никакие другие объекты. Это остров изоляции.

По сути, остров изоляции - это группа объектов, которые ссылаются друг на друга, но на них не ссылается ни один активный объект в приложении. Строго говоря, даже один объект, на который нет ссылок, также является островком изоляции.

Редактировать из комментария:

class A {
   B myB; 
} 
class B { 
   A myA; 
} 

/* later */  
A a = new A(); 
B b = new B();  
a.b = b; 
b.a = a;
10 голосов
/ 27 апреля 2009

Вот хорошее объяснение этого термина. Выдержки:

  • "Если объект obj1 является сборщиком мусора, но другой объект obj2 содержит ссылку на него, затем obj2 также имеет право на мусор Коллекция "
  • "Если объект obj2 может получить доступ к объекту obj1, который подходит для мусора сбор, то obj2 также имеет право для сбора мусора "

Это называется "Остров изоляции". «Остров изоляции» описывает один или более объектов не имеют ссылок на они из активных частей применение.

9 голосов
/ 27 апреля 2009

Следует помнить, что объекты собираются только в том случае, если на них прямо или косвенно ссылаются из корневого объекта GC (потоки, текущие локальные переменные, статические переменные и т. Д.). Если два (или более) объекта ссылаются друг на друга, но не ссылаются на них из корня, то они имеют право на сборку мусора.

3 голосов
/ 28 февраля 2017

На самом деле, если вы понимаете концепцию «Марк и уборка мусора», вы лучше поймете и остров изоляции:

  • Алгоритм начинается с корней GC: основной поток, локальные переменные в основном методе, статические переменные основного класса.
  • Алгоритм перебирает все ссылки на объекты, начиная с корней GC, и помечает каждый найденный объект как живой.
  • Вся память кучи, которая не занята отмеченными объектами, освобождается. Он просто помечается как свободный, по существу, очищенный от неиспользуемых объектов.
  • Если два или более объектов ссылаются друг на друга, но на них не ссылаются объекты, связанные с каким-либо корнем, они находятся на острове изоляции и тоже охватываются.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...