2013-01-24 7 views
9

Javaでは、xを指す強い参照がなく、xがガベージコレクションに適格である場合、ガベージコレクトはオブジェクトxに対してfinalizeメソッドを呼び出します。 finalizeメソッドが決して終了しない場合、メモリリークが発生するでしょうか?Java:メモリリークを作成する定義済みのfinalizeメソッド

 
public class X{ 
    protected void finalize(){ 
    while(true){} 
    } 
} 
+7

あなたはそれを試してみませんか? –

答えて

2

はい。
finalizeメソッドの内部でも、finalizeメソッドが呼び出されたオブジェクトに対して有効な参照を与えると、Javaはオブジェクトのガベージコレクションを行わず、finalizeメソッドを再度呼び出しません。

2

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

ガベージコレクションで復活について

Googleとあなたは

6

はい、それは、簡単には私が

を得たいくつかの時間後に

public class X { 

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

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

をテストすることになるfinalizeメソッドは、GCを保証するものではありません。さまざまなインスタンスを取得します

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

私がfinalize()を削除したとき、テストは決して止まらなかった。 JVMがOOMを行く前に、それは時間がかかること

ところでそれは

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

GCを破るために、このテスト

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(); 
     } 
    } 
} 

を実行するために十分だコメントを出し注意//System.out.println( );

+1

+1実際に試してみてください! =) – pcalcao

+0

興味深いことに、Mac OS Xでは、プログラムはエラーメッセージなしで終了します。 whileループの周りに例外処理を追加しましたが、例外は検出されませんでした。ファイナライザから出力されたものをいくつか追加しましたが、これは呼び出されたかどうかを確認するためだけに表示されていました。 – Henrik

+0

おっと、あなたはわかりません、私の答えを "はい、そうかもしれません..."と修正しました。 –

0

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

関連する問題