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