Java:未定义的finalize方法会导致内存泄漏。

16 浏览
0 Comments

Java:未定义的finalize方法会导致内存泄漏。

在Java中,如果没有强引用指向一个对象x且x符合垃圾收集的条件,垃圾收集器将调用x的finalize方法。那么如果finalize方法从不终止,这会导致内存泄漏吗?

public class X{

protected void finalize(){

while(true){}

}

}

admin 更改状态以发布 2023年5月21日
0
0 Comments

肯定的。内存将在finalise方法返回后被释放。如果您的finalise方法永远不返回,内存将不会被释放。\n搜索垃圾收集中的复活,您将得到各种finalise方法无法保证垃圾收集的实例。

0
0 Comments

是的,它会,很容易测试

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.(X.java:5)
    at test.X.main(X.java:13)

注释掉 //System.out.println(); 即可一直工作

0