Java:未定义的finalize方法会导致内存泄漏。
Java:未定义的finalize方法会导致内存泄漏。
在Java中,如果没有强引用指向一个对象x且x符合垃圾收集的条件,垃圾收集器将调用x的finalize方法。那么如果finalize方法从不终止,这会导致内存泄漏吗?
public class X{
protected void finalize(){
while(true){}
}
}
admin 更改状态以发布 2023年5月21日
是的,它会,很容易测试
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(); 即可一直工作