Я только что прочитал эту статью: Правда о сборке мусора
В разделе "A.3.3 Невидимый" объясняется, как и когда объект попадает всостояние invisible
.
В приведенном ниже коде объект, присвоенный переменной foo
, станет invisible
после выхода из блока try/catch
и останется со строгой ссылкой до выхода из метода run
(что никогда не произойдет,потому что цикл while
работает вечно).
public void run() {
try {
Object foo = new Object();
foo.doSomething();
} catch (Exception e) {
// whatever
}
while (true) { // do stuff } // loop forever
}
В этой статье говорится:
Однако эффективная реализация JVM вряд ли обнулит ссылку, когда она выходит из области видимости.
Почему это не эффективно?
Моя попытка объяснения заключается в следующем:
Скажем, стек для этого метода содержит четыре элемента, степерь невидимый объект находится внизу.
Если вы хотите мгновенно собрать объект, вам нужно будет извлечь и сохранить три элемента, вытолкнуть и выбросить четвертый элемент, а затем поместить три еще действительных элемента обратно в стек.
Если вы соберете невидимый объект после того, как поток управления покинет метод run
, ВМ может просто вытолкнуть все четыре элемента и отбросить их.