В Java, когда объект становится недоступным? - PullRequest
17 голосов
/ 14 апреля 2011

В java, что такое недоступный объект?Когда объект становится недоступным?Изучая сборку мусора, я не смог понять эту концепцию.

Кто-нибудь может дать какие-нибудь идеи с примерами?

Ответы [ 4 ]

22 голосов
/ 14 апреля 2011

Когда больше нет ссылочных переменных, ссылающихся на него, ИЛИ, если он потерян на острове.

Остров, являющийся объектом, на который ссылается переменная ссылки, однако этот объект не имеет ссылкипеременные, указывающие на него.

class A { int i = 5; }
class B { A a = new A(); }
class C {
   B b;
   public static void main(String args[]) {
      C c = new C();
      c.b = new B();
      // instance of A, B, and C created
      c.b = null;
      // instance of B and A eligible to be garbage collected.
   }

РЕДАКТИРОВАТЬ: просто хочу указать, что, хотя экземпляр A имеет ссылку, он сейчас находится на острове, потому что экземпляр B не имеет ссылки на него,Экземпляр A имеет право на сборку мусора.

4 голосов
/ 14 апреля 2011

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

java.lang.ref. {Phantom, Soft, Weak} Ссылка Перечисляет недоступные объекты.Если финализатор запущен, GC уже знает, что он недоступен.

читать о завершении- http://java.sun.com/developer/technicalArticles/javase/finalization/

На языке, имеющем только сильные ссылки, объекты кучи могут быть доступны или недоступны из программы.Набор достижимых объектов определяется набором переменных класса и переменных метода в программе, указывающих на объекты кучи.Этот набор обычно называют корневым набором программы.Объект, на который указывает переменная в корневом наборе программы, достижим.Кроме того, объект может быть косвенно доступен.То есть объект достижим, если на него указывает другой достижимый объект.Такая цепочка ссылок из корневого набора программы на объект кучи называется путем достижимости.Объект может иметь более одного пути достижимости, а также вообще не иметь путей достижимости.Если объект не имеет путей достижимости, он считается мусором и может быть немедленно собран сборщиком мусора.

Объект переходит в недостижимое состояние, когда нет более сильных ссылок на него.Когда объект недоступен, он является кандидатом на сбор.Обратите внимание на формулировку: если объект является кандидатом на сбор, это не означает, что он будет немедленно собранJVM может свободно откладывать сбор данных до тех пор, пока не возникнет непосредственная потребность в памяти, используемой объектом.Важно отметить, что не просто сильная ссылка будет держать объект в памяти.Это должны быть ссылки на эту цепочку из корня сборки мусора.Корни GC - это специальный класс переменных, который включает

Временные переменные в стеке (любого потока) Статические переменные (из любого класса) Специальные ссылки из собственного кода JNI

больше, если вы хотитеhttp://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html

4 голосов
/ 14 апреля 2011

Объект недоступен, если на него больше нет ссылок или эти ссылки сами по себе являются объектами, не являющимися доступными.

Integer i = new Integer(4);
// the new Integer object is reachable  via the reference in 'i' 
i = null;
// the Integer object is no longer reachable. 
0 голосов
/ 14 апреля 2011

Недостижимый объект - это объект, который не имеет «достижимой» ссылки на него. Другими словами, нет ссылок на него.

...