Объект готов к сборке мусора, Java

Из http://java.sun.com/docs/books/performance/1st_edition/html/JPApGC.fm.html#99740 в примере A3.3 говорится, что объект может по-прежнему быть недоступен для сборки мусора, даже если он может быть вне области действия. IT доступен, только если метод снят со стека. Теперь, если мы рассмотрим следующий случай:

void foo(){
Dog a = new Dog();
Dog b = new Dog();
b=a
while(true)//loop for long time
}

Будет ли объект b доступен для сборки мусора сразу или только после возврата метода foo().


person Jatin    schedule 15.08.2011    source источник
comment
Вы имеете в виду, что объект b изначально имел в виду, верно, до того, как он был повторно назначен тому же объекту, что и a?   -  person Thilo    schedule 15.08.2011


Ответы (4)


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

person user207421    schedule 15.08.2011
comment
+1. и даже несмотря на то, что слот стека продолжает использоваться, он всегда будет содержать только назначенный ему последний объект. Вы также можете установить значение null, если не можете дождаться окончания метода. - person Thilo; 15.08.2011

Собака, ранее известная как b, должна получить право на сборку мусора, как только вы переназначите переменную.

Собака, известная как a, так и b (после этого переназначения), останется в области видимости до конца метода.

person Thilo    schedule 15.08.2011

Исходный b (второй созданный Dog) доступен для сборки мусора сразу перед запуском цикла, потому что на него нет ссылки (оба a и b ссылаются на первый созданный Dog).

person Bohemian♦    schedule 15.08.2011
comment
если это так, то in :public void run() { try { Object foo = new Object(); foo.doSomething(); } catch (Exception e) { // что угодно } while (true) { // что-то делать } // цикл навсегда } почему объект foo доступен для сборки мусора только при завершении выполнения - person Jatin; 15.08.2011
comment
@Jatin: я сомневаюсь, что это так. Все эти осиротевшие дураки будут собраны. - person Thilo; 15.08.2011

За исключением уже данных правильных ответов, ваш тест по существу ошибочен. Запуск пустого цикла while никогда не вызовет GC, так как он запускается (чтобы немного упростить) только тогда, когда у вас заканчивается память, а Java необходимо выполнить некоторую очистку старых объектов.

person Tomasz Nurkiewicz    schedule 15.08.2011
comment
под навсегда я подразумеваю цикл while с блоком кода внутри него. т.е. будет ли объект доступен сразу или после возврата метода - person Jatin; 15.08.2011
comment
@Jatin: Как можно собрать a или b до возврата метода? В конце концов, они все еще находятся в области видимости, например, их можно использовать в цикле. (Умный компилятор может узнать, действительно ли они используются, и сократить их область действия, но, согласно вашему коду, они имеют ту же область действия, что и метод). - person Thilo; 15.08.2011
comment
так что в основном это означает, что объекты доступны для сборки мусора только тогда, когда метод возвращается? в этом случае а и б - person Jatin; 15.08.2011