Что делает сборщик мусора, если доступна только одна переменная экземпляра объекта - PullRequest
0 голосов
/ 23 февраля 2020

Мой вопрос заключается в том, что говорит комментарий в этом фрагменте кода:

public class A {
    int x = 0;
}

public class B {
    String text = "a";
    A a = new A();
}

public class Test {
    public static void main(String[] args) {
        A a = null;
        if (a == null) {
            B b = new B();
            a = b.a;
        }
        // what happens with b inside the if statement now?
        // does a still point to b's instance variable?
        // what does the garbage collector do in this case?
    }
}

Поскольку класс B содержит другую переменную экземпляра с именем text Мне было интересно, что в этом случае будет делать сборщик мусора. Если b внутри оператора if не будет собирать мусор и a по-прежнему будет указывать на переменную экземпляра a из b, не будет ли text тратить пространство памяти тогда?

EDIT :

a внутри главной функции используется как-то позже и не является недоступным!

Интересная часть - это то, что происходит с b, потому что a внутри B все еще используется, но text нет.

Ответы [ 2 ]

1 голос
/ 24 февраля 2020
public static void main(String[] args) {
    A a = null;
    if (a == null) {
        B b = new B();
        a = b.a;
    }
    // let's suppose GC is called here
}

Оба экземпляра a и b не используются после оператора if - они могут и будут возвращены при запуске G C оба. Вы можете прочитать «неиспользованный» как «недостижимый». Это так просто.

С другой стороны, если вы измените его на:

public static void main(String[] args) {
    A a = null;
    if (a == null) {
        B b = new B();
        a = b.a;
    }
    // GC called here
    // somehow use "a"
}

Если вы сделаете a достижимым, его нельзя будет восстановить, только b может, так как, хорошо - никому не нужна.

0 голосов
/ 23 февраля 2020

После тестирования с устаревшим методом void finalize() я пришел к выводу, что b внутри оператора if получает сборщик мусора. Я получил этот результат, позвонив System.gc();.

...