8

Java では、x を指す強い参照がなく、x がガベージ コレクションの対象となる場合、ガベージ コレクションはオブジェクト x の finalize メソッドを呼び出します。finalize メソッドが終了しないと、メモリ リークが発生しますか?

パブリッククラスX{
  保護されたボイドファイナライズ(){
     while(真){}
  }
}
4

4 に答える 4

6

はい、簡単にテストできます

public class X {

    protected void finalize() {
        while (true) {
        }
    }

    public static void main(String[] args) throws Exception {
        while (true) {
            new X();
        }
    }
}

しばらくして私は

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"

finalize()を削除したとき、テストは停止しませんでした。JVMがOOMになるまでに時間がかかることに注意してください

ところで、このテストを実行するのに十分です

public class X {
    byte[] a = new byte[100 * 1000 * 1000];

    protected void finalize() {
        System.out.println();
    }

    public static void main(String[] args) throws Exception {
        while (true) {
            new X();
        }
    }
}

GCを破る

Exception in thread "main" 
java.lang.OutOfMemoryError: Java heap space
    at test.X.<init>(X.java:5)
    at test.X.main(X.java:13)

コメントアウト//System.out.println(); そしてそれはノンストップで動作します

于 2013-01-24T11:15:21.593 に答える
2

間違いなく、finalizeメソッドが戻った後、メモリの割り当てが解除されます。また、finalizeが戻らない場合、momoryの割り当ては解除されません。

グーグルはガベージコレクションの復活について、finalizeメソッドがgcを保証しないさまざまなインスタンスを取得します

于 2013-01-24T11:13:58.913 に答える
2

はい。
また、ファイナライズ メソッド内で、ファイナライズ メソッドが呼び出されるオブジェクトに有効な参照を与えると、Java はオブジェクトをガベージ コレクションしません。

于 2013-01-24T11:12:05.493 に答える
0

java.lang.ref.Finalizer$FinalizerThread (The Secret Life Of The Finalizer)をブロックし、finalize メソッドを実装するすべてのクラスのインスタンスが java.lang.ref.Finalizer.ReferenceQueue でブロックされます。'finalize' を使用して新しいオブジェクトを作成し続けると、 finalize の実行を待機しているオブジェクトによってメモリが使い果たされます。ヒープ ダンプを取得すると、オブジェクトが java.lang.ref.Finalizer によって保持されていることがわかります。以下の例を参照してください (実際のケースです)。ここに画像の説明を入力

于 2013-02-22T01:49:55.083 に答える