2016-12-27 2 views
-2

Я немного смущен, чтобы узнать, сколько объектов имеют право на GC, когда линия 18. Plz объяснитьСколько объектов имеют право на GC, когда линия 18 // TODO

class B{} 
class A{ 
    static B b1; 
    B b2; 
} 
public class Test { 
    public static void main(String[] args) { 
     B b1=new B(); 
     B b2=new B(); 
     A a1=new A(); 
     A a2=new A(); 
     a1.b1=b1; 
     a1.b2=b1; 
     a2.b2=b2; 
     a1=null; 
     b1=null; 
     b2=null; 
     // TODO Auto-generated method stub 
    } 
} 

Сколько объектов имеют право для GC, когда линия 19

+1

зависит от которого линия строка 19;) – Mark

+1

линию 19 Предполагая, что является последним (т. е. закрывающая скобка) «main», все объекты имеют право на GC, так как это конец программы. Сколько из них я не могу точно сказать, так как я точно не знаю, какие классы загружаются JVM. После 'a1 = null;', только для 'a1' подходит для gc. После 'b1 = null;', 'b1' получает право на GC. 'b2' не получает права на GC после' b2 = null; ', поскольку он все еще доступен через' a2.b2'. – Turing85

+0

Ссылаясь на мое прежнее замечание: обратите внимание, что когда я worte «a1' получает право на GC», я на самом деле имел в виду «объект,' a1 », на который ссылался, прежде чем он был установлен в« null », получает право на GC». Трудно говорить об этом объекте, поскольку он существует и безымянный, если он не собирает мусор. Надеюсь, что намеченное значение ясно. – Turing85

ответ

1

Предполагая, что линия 19 является линией отмечен TODO Auto-generated method stub, то объекты, созданные программой единственным объектом, который является право для GC по линии 19 является объектом называется переменной a1 ,

Объект, который был первоначально присвоен a2, по-прежнему назначен, поэтому он недоступен.

Статическое значение в A.b1 по-прежнему назначено объекту, который изначально был назначен для b1, чтобы объект не был доступен для GC - статические значения в реальном времени для времени жизни класса, так что хотя экземпляр a1 может получить GC ' d статический экземпляр, который был назначен через него, по-прежнему можно ссылаться.

Поскольку экземпляр a2 по-прежнему назначен, поле экземпляра a2.b2 также недоступно для GC. Это значение содержит экземпляр B, первоначально назначенный локальной переменной b2 в основном методе.

Из четырех объектов, созданных в основном методе, единственным, фактически доступным для GC конечной линией программы, является объект, первоначально назначенный a1. Это только ссылка была установлена ​​в значение null, и поэтому ничего больше невозможно достичь. Все остальные экземпляры достижимы либо через локальную переменную (a2), статическую ссылку (A.b1), либо ссылку на экземпляр (a2.b2).

1

Зеленые объекты имеют право на сбор мусора.

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

Однако статические ссылки фактически не нуждаются в существовании объекта (A без: справа означает статическую ссылку b1).

: А представляет собой объект класса А

: В представляет собой объект класса B

enter image description here

Смежные вопросы