3

System.gc()GCを引き起こすことが保証されていないことはわかっていますが、理論的には、次のコードで、オブジェクトobjはガベージコレクションの対象になりますか?

public class Demo {

    public static void main(String[] args) throws Exception {
        SomeClass obj = new SomeClass();
        ArrayList list = new ArrayList();
        list.add(obj);
        obj = null;
        System.gc();
    }

}

class SomeClass {
    protected void finalize() {
        System.out.println("Called");
    }
}
4

5 に答える 5

9

System.gc()作成したSomeClassインスタンスを呼び出した時点では、まだオブジェクトによって参照されているため、つまりまだ到達可能であるため、ガベージ コレクションの対象にはなりませんlist

ただし、このメソッドが返されるとすぐlistに範囲外にobjなるため、ガベージ コレクションの対象になります ( と同様list)。

null への参照を設定するだけでは、参照先objのオブジェクトがガベージ コレクションの対象になるわけではありません。オブジェクトは、可視オブジェクトのグラフからの参照がない場合にのみ適格です。

于 2013-03-19T06:17:26.830 に答える
4

オブジェクトobjはガベージコレクションの対象になりますか?

それらのオブジェクトのみがガベージコレクションされ、それらに到達するための参照が1つもありません。(循環接続を除く)

あなたのコードでは、を指している2つの参照がありますnew SomeClass();

  1. obj
  2. リストの0番目のインデックス

あなたが置くobj = null、すなわちそれはもうそのオブジェクトを指していない。ただし、そのオブジェクトにアクセスするために使用できる別の参照がリストに存在します。

したがって、オブジェクトは、戻ったときにのみGCの対象になりmainます。finalizeつまり、メソッドが呼び出されても、メソッドの出力は表示されません。(JVMがまだそれを呼び出すかどうかはわかりません)

于 2013-03-19T06:25:54.787 に答える
3

いいえ、オブジェクトが実際にリストに存在するためです。

于 2013-03-19T06:18:07.720 に答える
1

Java プログラマーは、Java でガベージ コレクションを強制することはできません。JVM が Java ヒープ サイズに基づいてガベージ コレクションが必要であると判断した場合にのみトリガーされます。

Java プログラムが起動すると、Java 仮想マシンはオペレーティング システムからメモリを取得します。Java 仮想マシンまたは JVM は、このメモリを必要に応じて使用します。このメモリの一部は Java ヒープ メモリと呼ばれます。

Java のヒープは通常、アドレス空間の最下部に位置し、上に移動します。new 演算子を使用してオブジェクトを作成するか、別の方法でオブジェクトを作成するたびに、オブジェクトにヒープからメモリが割り当てられ、オブジェクトが死ぬかガベージ コレクションが行われると、メモリは Java のヒープ領域に戻ります

編集 :

オブジェクト obj はガベージ コレクションの対象になりますか?

いいえ、オブジェクトはまだ ArrayList にあるためです。

于 2013-03-19T06:18:32.553 に答える
-2

同意しました。リストにある限り、ガベージコレクションは行われません。

于 2013-03-19T06:14:03.230 に答える