public class Gc {
private static Gc a=null;
private void info(){
System.out.println("info()");
}
public static void main(String[] args) {
new Gc();
//System.gc(); 也可以
Runtime.getRuntime().gc();
a.info();
}
@Override
protected void finalize() throws Throwable {
a=this;
}
}
结果:
在看下面这种情况:
public class Gc {
private static Gc a=null;
private void info(){
System.out.println("info()");
}
public static void main(String[] args) {
new Gc();
//System.gc(); 也可以
Runtime.getRuntime().gc();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
a.info();
}
@Override
protected void finalize() throws Throwable {
a=this;
}
}
结果:
为什么会出现这种情况呢?
程序中我们new了一个匿名对象,由于没有赋值给任何变量,所以该对象立即进入了可恢复状态,我们System.gc()后,垃圾回收器其实是不能立即进行回收,否则就会调用finalize方法;所以当我们调用了sleep后,垃圾回收器会受到程序的通知,因此开始进行垃圾回收,调用可恢复对象的finalize方法,让a指向匿名对象。