请问gc什么时候调用finalize方法啊

来源:百度知道 编辑:UC知道 时间:2024/06/10 12:24:48
我写了个测试代码
public class T {

@Override
protected void finalize() throws Throwable {

System.out.println("收走");
super.finalize();
}

public static void main(String[] args) {

T t=new T();

System.gc();

}

}

不管我写不写System.gc(); 都没有打印出任何东西,也就是说没有调用我的重写的finalize方法,也就是说我开辟的这个T对象没有被回收啊,这是为什么呢。

public class T {

@Override
protected void finalize() throws Throwable {

System.out.println("收走");
super.finalize();
}

public static void main(String[] args) {

// T t=new T(); // 这里不可以这样写,要换成
new T ();

// 如果安你那样写,垃圾回收器,会认为仍有一个句柄指向
// 该内存空间,所以是不会调用该类的finalize方法的

System.gc();

}

}

你的t还在 编译器并不认为t是垃圾 那怎么垃圾收集呢?
当指向一个对象的引用数为0时,垃圾收集器才认为这个对象没有用了。所以要这样把指向那个new T的引用置为0
T t = new T();
t = null;

public static void main(String[] args) {
for(int i = 0; i < 20; i ++){
T t=new T();
System.gc();
}