Java:错误定义的finalize方法来创建内存泄漏

use*_*196 8 java

在java中,如果没有指向x的强引用并且x有资格进行垃圾收集,则垃圾收集将在对象x上调用finalize方法.如果finalize方法永远不会终止,这会导致内存泄漏吗?

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

Evg*_*eev 6

是的,很容易测试

public class X {

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

    public static void main(String[] args) throws Exception {
        while (true) {
            new X();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

过了一段时间我得到了

Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"
Run Code Online (Sandbox Code Playgroud)

当我删除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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

打破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)
Run Code Online (Sandbox Code Playgroud)

注释掉//System.out.println(); 它不停地工作


xyz*_*xyz 2

是的。
另外,在 Finalize 方法中,如果对调用 Finalize 方法的对象提供有效引用,Java 不会对该对象进行垃圾回收,也不会再次调用 Finalize 方法,因为它只调用一次。