-1

与えられた:

interface Animal {
    void makeNoise();
}

class Horse implements Animal {
    Long weight = 1200L;

    public void makeNoise() {
        System.out.println("whinny");
    }
}

public class Icelandic extends Horse {
    public void makeNoise() {
        System.out.println("vinny");
    }

    public static void main(String[] args) {
        Icelandic i1 = new Icelandic();
        Icelandic i2 = new Icelandic();
        Icelandic i3 = new Icelandic();
        i3 = i1;
        i1 = i2;
        i2 = null;
        i3 = i1;
        System.out.println("end of program");
    }
}

最後のステートメントでガベージ コレクタの対象となるオブジェクトの数 (つまり、プログラムの終了を表示する場所)。答えは 4 ですが、どうやって 4 で、最大 3 つのオブジェクトがあるのか​​わかりませんでした。

4

3 に答える 3

1

あなたはこれを正しく見ていません。すべての「アイスランド」オブジェクトが、この行でのガベージ コレクションの対象となるわけではありません。また、各「Icelandic」オブジェクトには、ガベージ コレクションの対象となる別のオブジェクト、具体的には Long があります。これは、「Icelandic」オブジェクトを含むオブジェクトがスコープ外になるか、そのオブジェクトへのライブ参照がなくなった場合です。

この例では、元の i2 オブジェクトと「それに属する」Long は、System.log 行の後までガベージ コレクションの対象になりません。

于 2013-05-20T17:49:19.190 に答える
0

短い答えは、質問には答えがないということです。

コマンドライン引数を含む は、呼び出しのString[]最後に GC の対象になる場合があります。値はのLong内部キャッシュにある場合とない場合がありますLong.valueOf

後で読み取られないローカル変数への割り当てが GC に影響を与えることは保証されていません。これは、割り当てが最適化され、活性分析のために変数が再利用される可能性があるためです。これは、コードの JIT コンパイル後に変更される可能性があります。

于 2013-05-20T17:50:51.727 に答える