Сборка мусора Острова изолированных объектов - PullRequest
2 голосов
/ 28 июля 2011

Я не понимаю значения «островков изолированных объектов»

class X2{  
    public X2 x; 

    public static void main(String... args){  
        X2 x2 = new  X2();  
        X2 x3 = new  X2();  
        x2.x = x3;  
        x3.x = x2;  
        x2 = new X2();  
        x3 = x2;  
        doComplexStuff();  
    }  
}

после запуска строки 9, сколько объектов пригодно для сборки мусора? Сначала я думал, что нет. Но ответов два. Что происходит, например, с x2.x и x3.x? они тоже объекты, не так ли? Честно говоря, я не понимаю этого вопроса K & B.

Ответы [ 2 ]

4 голосов
/ 28 июля 2011

В этом примере вы создаете всего 3 объекта (в строках 4, 5 и 8). Я назову их o1, o2 и o3 соответственно. На o1 ссылается x2, на o2 ссылается x3. Они также содержат ссылку друг на друга (o1.x = x2.x ссылки o2, o2.x = x3.x ссылки o1). Когда строка 8 выполняется, на o1 больше не ссылается x2, но на него все еще ссылается o2.x = x3.x. Когда строка 9 выполняется, на o2 больше не ссылается x3, но на него все еще ссылается o1.x.

В этот момент o1 и o2 по-прежнему ссылаются друг на друга. Однако нет никаких других ссылок на эти объекты, поэтому они не могут быть использованы. Поэтому они имеют право на сбор мусора.

2 голосов
/ 28 июля 2011

Если сборка мусора была основана на правиле

Кто-нибудь получил ссылку на меня?

Тогда x2 относится к x3, а x3 относится к x2, поэтому к ним относятся оба, поэтому они не будут собирать мусор.

Однако правила сборки мусора умнее этого. x2 и x3 - маленький «островок», и как только мы покидаем область, в которой они были объявлены, ни один другой объект не имеет ссылки на них. Таким образом, весь «остров» не может быть достигнут, поэтому весь остров является мусором.

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