在java中,如果没有强引用指向x并且x符合垃圾收集条件,则垃圾收集将调用对象x的finalize方法。如果finalize方法永远不会终止,会导致内存泄漏吗?
public class X{
protected void finalize(){
while(true){}
}
}
是的,会的,很容易测试
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 之前需要一段时间
BTW运行这个测试就足够了
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();而且它不间断地工作
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)