think in java 中提到GC时,那是不是只要显式的调用了 System.GC() 就会触发 finalize呢?
例如:
public class Test { public void finalize(){System.out.println("finalize!");}; public static void main(String[] args) { // TODO Auto-generated method stub Test t = new Test(); System.gc(); } }
上述代码执行后,并不会调用finalize
刚开始我不能理解,后来google到一位大牛feiyuegaoshan的解释,豁然开朗
原因是System.GC只是通知系统立刻进行GC操作,至于GC是否回收对象,只有GC自己说了算,
而且GC是相当有智商和情商的,在上述代码的情况下,
GC发现了对象引用t,它引用了Test对象,也就是说GC认为Test对象还有人用,因此不予清理
那如何让GC清理呢?只要对象没有人引用就可以了,例如:
public class Test { public void finalize(){System.out.println("finalize!");}; public static void main(String[] args) { // TODO Auto-generated method stub Test t = new Test(); t = null; System.gc(); } }
只要把对象引用t置空,再用System.GC通知GC开始回收,GC会发现Test对象已经没有人使用了,
就会开始清理,同时触发了finalize方法。
那假设我没有显式的返回对象引用,只是new对象出来,例如:
把Test t = new Test(); 换成new Test();,GC会怎么考虑呢?
答案是GC认为这东西没人用 :)
本文探讨了Java中垃圾回收(GC)与finalize方法的关系。通过示例代码演示了System.gc()的作用及如何触发对象的finalize过程。进一步解析了对象引用在GC中的作用及其对finalize调用的影响。
984

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



