Сборка мусора Java, установка ссылки на ноль - PullRequest
2 голосов
/ 17 марта 2012
public class A{
    A a;

    public static void main(String args[]){
        A b = new A();//new object created, obj1
        b.a = new A();//new object created, obj2
        b = null;
        //line 8
    }
}

Когда линия 8 достигнута, obj1 имеет право на GC. Имеет ли obj2 право на GC?

Ответы [ 4 ]

5 голосов
/ 17 марта 2012

Единственная ссылка, которую вы создали на obj2, была в пределах obj1 (b.a = new A();).Как только вы потеряли свою ссылку на obj1 (b = null;), вы также потеряли свою ссылку на obj2, так что да, она подходит для GC.

3 голосов
/ 17 марта 2012

Если вы хотите определить право объекта на сборку мусора, попробуйте проверить, достижим ли он из корневого набора. Корневой набор - это объекты, на которые ссылаются из стека вызовов и глобальные переменные.

В вашем примере корневой набор изначально состоит из obj1 и args (давайте проигнорируем любые другие, которые могут существовать - они не имеют значения для вашего примера). Непосредственно перед строкой 6 obj2 явно доступен из корневого набора, поскольку obj1 содержит ссылку на obj2. Но после строки 7 единственным объектом в корневом наборе является args. От args нельзя ссылаться на obj1 или obj2, поэтому в строке 8 оба значения obj1 и obj2 имеют право на сбор.

1 голос
/ 17 марта 2012

Да, и вот пример, показывающий GC в действии:

static int c = 2;
public static void main(String args[]) throws Exception {
    class A{ 
        A a; 
    }
    A b = new A(){
        public void finalize(){
            System.out.println("obj 1 has been GC'd");
            c--;
        }
    }; 
    b.a = new A(){
        public void finalize(){
            System.out.println("obj 2 has been GC'd");
            c--;
        }
    }; 
    b = null;        
    while(c>0) {
        System.gc();
        Thread.sleep(42);
    }
}

Выход:

obj 1 has been GC'd
obj 2 has been GC'd
0 голосов
/ 17 марта 2012
   b = null;

бесполезен, потому что через одну строку вы уже достигнете конца области b.Ни один из 2 объектов недоступен после выхода из области, в которой они определены, поскольку их ссылка не была помещена где-либо еще, при вызове метода или как параметр в вызове конструктора, или как обратная ссылка от чего-то еще, что было опубликовано где-то еще,

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