在java一个对象如何才能撤销自己呢?就是标注上自己可以被垃圾收集器回收。
写了如下一个测试类
public class Test {
public static void main(String[] args) {
TestGC t1 = new TestGC();
t1.destroyClass(t1);
//t1 = null;
System.gc();
}
}
class TestGC {
public void destroyClass(TestGC tg){
tg = null;
}
/* (non-Javadoc)
* @see java.lang.Object#finalize()
*/
@Override
protected void finalize() throws Throwable {
System.out.println("GC is start");
super.finalize();
}
}
结果无输出,证明finalize方法没有被调用。
但是把t1 = null;的注释去掉后再运行。
结果输出: "GC is start"
问题解决了,还是自己对java的内存机制理解的不到位.
t1.destory(t1),是把2个指向TestGC对象的引用(t1和tg)其中的tg赋为null了,但是目前还有一个t1引用指向这个对象,所以jvm并不会调用gc。
而t1 = null 是把唯一指向TestGC对象的那个引用赋为null了。之后没有任何引用指向这个对象了,所以jvm会调用gc来回收这块内存。