Сборка мусора составных объектов - PullRequest
7 голосов
/ 13 мая 2011

У меня есть два класса

Class A
{
    //constructor
}

Class B
{
    private A a;

    public B()
    {
        a = new A();
    }
}

Предположим, я использую объект B [скажем b] в своем коде, и после того, как я в конечном итоге использую его, я установил его на null.Я знаю, что объект B теперь доступен для сборки мусора.

Я знаю, что после установки b в ноль, он будет немедленно иметь право на сборку мусора?Но как насчет объекта типа А?Будет ли он доступен для сборки мусора немедленно после того, как я установлю B на null?Или это будет приемлемое для сбора мусора после того, как B будет собирать мусор ?

Теоретически, до тех пор, пока B не будет собран сборщик мусора, a по-прежнему имеет ссылку на него?Поэтому компилятор SUN JVM обнаружит это сразу после установки b = null;

Ответы [ 5 ]

5 голосов
/ 13 мая 2011

ГХ достаточно умен, чтобы следовать путям на графиках объектов, чтобы проверить, доступны ли существующие ссылки на некоторые объекты. Он даже может обнаружить циклы (например, в вашем случае, если b содержал ссылку на a, а a содержал ссылку на b.

3 голосов
/ 13 мая 2011

Как только нет жестких ссылок на b, невозможно найти ссылку на a, поэтому, насколько мне известно, оба имеют право на сборку мусора.

0 голосов
/ 13 мая 2011

Объект A также станет подходящей сборкой мусора, как только вы установите для ObjectB значение null (* условие - ObjectA не указан ни одним другим live объектом). Это состояние известно как «остров изоляции».

Здесь - хорошее объяснение этой ситуации. ( Здесь - еще одно объяснение из книги SCJP)

0 голосов
/ 13 мая 2011

Есть также некоторые флаги, которые вы можете использовать при запуске Java-программы (по крайней мере с Sun JVM), которая даст некоторую отладочную информацию о том, что происходит во время сборки мусора. Попробуйте параметр -verbose: gc .

http://download.oracle.com/javase/6/docs/technotes/tools/solaris/java.html

0 голосов
/ 13 мая 2011

Как правило, вам все равно.Это не достижимо, и вы должны позволить сборщику мусора беспокоиться об остальном.Поскольку он становится недоступным, он должен быть сразу же доступен для сбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...