1

Java で GC がどのように機能するかについて質問があります。次のコードを検討してください。

class C1 {
    ArrayList<int> myList = new ArrayList<int>();

    public void setList(ArrayList<int> l) {
         myList = l;
    }
}

func(C1 C) {
    ArrayList<int> l1 = new ArrayList<int>();
    l1.add(1);
    C.setList(l1);
}

main() {
    C1 C = new C1();
    func(C);
    ...
}

私の質問は: GC はfunc()リターン後に 'l1' をリリースしますか?

4

2 に答える 2

5

いいえ、そうではありません。新しい へのC強い参照 ( ) を持つルート参照 (スタック変数 ) があるためです。返された後、とは収集可能です。これは、ルート参照が消えるためです。myListArrayListmain()C1ArrayList

于 2012-07-02T14:51:02.660 に答える
2

実際には、HotSpot の JIT が行う最適化があります。これは、ローカル変数がアクセスされなくなるポイントを検出し、その瞬間にそれをクリアすることです。したがって、あなたの質問に対する完全な答えは、「可能性はありますが、保証はありません」です。最近、いくつかのコードをいじって、大きな配列が消費するメモリを測定しました。array.hashCode()メソッドの最後に実際に挿入するまでは、以前にリリースされていたことに気付きました。

于 2012-07-02T15:23:31.453 に答える