Java では、x を指す強い参照がなく、x がガベージ コレクションの対象となる場合、ガベージ コレクションはオブジェクト x の finalize メソッドを呼び出します。finalize メソッドが終了しないと、メモリ リークが発生しますか?
パブリッククラスX{ 保護されたボイドファイナライズ(){ while(真){} } }
Java では、x を指す強い参照がなく、x がガベージ コレクションの対象となる場合、ガベージ コレクションはオブジェクト x の finalize メソッドを呼び出します。finalize メソッドが終了しないと、メモリ リークが発生しますか?
パブリッククラスX{ 保護されたボイドファイナライズ(){ while(真){} } }
はい、簡単にテストできます
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(); そしてそれはノンストップで動作します
間違いなく、finalizeメソッドが戻った後、メモリの割り当てが解除されます。また、finalizeが戻らない場合、momoryの割り当ては解除されません。
グーグルはガベージコレクションの復活について、finalizeメソッドがgcを保証しないさまざまなインスタンスを取得します
はい。
また、ファイナライズ メソッド内で、ファイナライズ メソッドが呼び出されるオブジェクトに有効な参照を与えると、Java はオブジェクトをガベージ コレクションしません。
java.lang.ref.Finalizer$FinalizerThread (The Secret Life Of The Finalizer)をブロックし、finalize メソッドを実装するすべてのクラスのインスタンスが java.lang.ref.Finalizer.ReferenceQueue でブロックされます。'finalize' を使用して新しいオブジェクトを作成し続けると、 finalize の実行を待機しているオブジェクトによってメモリが使い果たされます。ヒープ ダンプを取得すると、オブジェクトが java.lang.ref.Finalizer によって保持されていることがわかります。以下の例を参照してください (実際のケースです)。