在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();
}
}
}
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(); 它不停地工作
是的。
另外,在 Finalize 方法中,如果对调用 Finalize 方法的对象提供有效引用,Java 不会对该对象进行垃圾回收,也不会再次调用 Finalize 方法,因为它只调用一次。
| 归档时间: |
|
| 查看次数: |
571 次 |
| 最近记录: |