Из http://java.sun.com/docs/books/performance/1st_edition/html/JPAppGC.fm.html#99740 пример A3.3 говорит, что он говорит, что объект все еще может быть недоступен для сборки мусора, даже если он находится вне области видимости. ЭТО доступно, только если метод снят со стека. Теперь, если мы рассмотрим следующий случай:
void foo(){ Dog a = new Dog(); Dog b = new Dog(); b=a while(true)//loop for long time }
Будет ли объект b, ссылающийся на немедленную доступность для сборки мусора, или только после возврата метода foo ().
Слот стека остается в использовании до выхода из метода. Нет никакого кода операции JVM, соответствующего внутреннему}, поэтому JVM не знает, что он вышел из внутренней области видимости. Но он знает, когда метод возвращается.
Собака, ранее известная как b, должна получить право на сборку мусора, как только вы переназначите переменную.
b
Собака, известная как a и b (после этого переназначения), останется в области действия до конца метода.
a
Исходный b (второй созданный Dog) сразу же доступен для сборки мусора до запуска цикла, поскольку на него нет ссылки (и a, и b ссылаются на сначала Dog создано).
Dog
За исключением правильных ответов, ваш тест по существу неверен.Запуск пустого цикла while никогда не будет запускать GC, поскольку он запускается (чтобы немного упростить), когда у вас заканчивается память, а Java необходимо выполнить некоторую очистку старых объектов.
while