class C {
static A a;
}
class A {
public void live(){
System.out.println("alive");
}
@Override
public void finalize() {
System.out.println("A finalize");
C.a = this;
}
}
public class Test {
public static void main(String[] args) throws InterruptedException {
A a = new A();
a = null;
C.a=null;
System.gc();
Thread.sleep(5000);
C.a.live();
}
}
没报错,a重生了
代码改成如下:
A a = new A();
a = null;
System.gc();
Thread.sleep(5000);
C.a=null; //只有这改了
C.a.live();
报错,空指针异常
___________________________________
明白了,
C.a=null;
System.gc();
连的太紧了,无论这两句哪句先哪句后,gc线程的启动都没能执行。所以C.a=null一定先于finalize中的 C.a=this,所以C.a重生了
本文探讨了Java中对象引用、垃圾回收机制及其影响,通过实例展示了对象引用的生命周期和垃圾回收过程中可能出现的问题,强调了`System.gc()`与`finalize()`方法的使用时机和后果。
2394

被折叠的 条评论
为什么被折叠?



