сборка мусора java - PullRequest
       10

сборка мусора java

5 голосов
/ 12 января 2010

Я рассматривал этот вопрос на сайте подготовки к SCJP. Насколько правильный ответ А?

Что верно в отношении объектов, на которые ссылаются a, b, aa в строке, помеченной "// некоторый код идет здесь "?

class A {
    private B b;
    public A() {
        this.b = new B(this);
    }
}

class B {
    private A a;
    public B(A a) {
        this.a = a;
    }
}

public class Test { 
    public static void main(String args[]) {
        A aa = new A();
        aa = null;
        // some code goes here
    }
}


A) The objects referenced by a and b are eligible for garbage collection.
B) None of these objects are eligible for garbage collection.
C) Only the object referenced by "a" is eligible for garbage collection.
D) Only the object referenced by "b" is eligible for garbage collection.
E) Only the object referenced by "aa" is eligible for garbage collection.

Ответ: A

Ответы [ 2 ]

8 голосов
/ 12 января 2010

Java использует не только простой сборщик мусора с подсчетом ссылок.

Когда JVM выполняет полный прогон GC, он обходит весь граф объектов, отмечая каждый найденный элемент. Любые предметы, которые не отмечены, подлежат очистке.

Поскольку ни a, ни b недоступны из вашего основного кода, они не будут помечены и, следовательно, могут быть удалены.

2 голосов
/ 12 января 2010

ну, чтобы что-то не было сборщиком мусора, должно быть невозможно добраться до него из любого места в стеке. Учитывая, что стек в этой точке имеет только нулевое значение для aa и одного массива строк (аргументов), невозможно получить доступ к a или b.

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