1

Testerクラスのmainメソッドが終了したときに、ガベージコレクションの対象となるオブジェクトはいくつありますか?私の印象では、答えは2つ、特にa1、b1です。しかし、私はどこかで正しい答えとして、a1オブジェクトだけが適格であることに気づきました。a2のメンバー変数としてb1を割り当てていないので、メインエンドの前にb1がnullに割り当てられているので、ガベージコレクターによって収集する必要があると思います。何が本当?

class B {
}

class A {
    static B b1;
    B b2;
}

public class Tester {
    public static void main(String[] args) {
        B b1 = new B();
        B b2 = new B();
        A a1 = new A();
        A a2 = new A();
        a1.b1 = b1;
        a1.b2 = b1;
        a2.b2 = b2;
        a1 = null;
        b1 = null;
        b2 = null;
    }
}
4

3 に答える 3

2

メソッドスコープ変数に最初に割り当てられたオブジェクトは、でのオブジェクトへの参照が静的b1であるため、収集の対象にはなりません。a1の特定のインスタンスで期限切れになることはありません。これは、同じリファレンスである、ちょっと変わったJava構文ですが、それが何であるかを示しています。その参照は、a1などのAのインスタンスに何が起こっても、クラスAがアンロードされるかJVMが存在するまで有効なままです。Class Aa1.b1A.b1

コードb1はメソッド内のポインターをnullに割り当てますが、nullには割り当てませんA.b1

于 2012-11-13T21:17:01.860 に答える
0

無効にしていない唯一の参照はですa2。あなたの答えは、あなたがたどることができないどんなオブジェクトにもなりますa2

したがって、がありa2b2によって参照されますa2.b2

a1および(mainメソッドの範囲内で)できないため、ガベージコレクションされます。

実際には、affeは正しく、b1静的であるため、到達可能です。

于 2012-11-13T21:15:00.807 に答える
0
  • a2-無効化されなかったため
  • b2(に割り当てられた元のオブジェクトb2)-a2によって保持されているため
  • b1(に割り当てられた元のオブジェクトb1)-static変数に保持されているため
于 2012-11-13T21:17:33.667 に答える