Chinaunix首页 | 论坛 | 博客
  • 博客访问: 898003
  • 博文数量: 282
  • 博客积分: 10843
  • 博客等级: 上将
  • 技术积分: 2435
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-01 15:23
文章分类

全部博文(282)

文章存档

2013年(1)

2012年(18)

2011年(14)

2010年(30)

2009年(48)

2008年(55)

2007年(55)

2006年(61)

分类: Java

2012-03-18 20:15:08

think in java 中提到GC时,那是不是只要显式的调用了 System.GC() 就会触发 finalize呢?

例如:

[java] view plaincopy

publicclassTest{

publicvoidfinalize(){System.out.println("finalize!");};

publicstaticvoidmain(String[]args){

//TODOAuto-generatedmethodstub

Testt=newTest();

System.gc();

}

}

上述代码执行后,并不会调用finalize

刚开始我不能理解,后来google到一位大牛的解释,豁然开朗

原因是System.GC只是通知系统立刻进行GC操作,至于GC是否回收对象,只有GC自己说了算,

而且GC是相当有智商和情商的,在上述代码的情况下,

GC发现了对象引用t,它引用了Test对象,也就是说GC认为Test对象还有人用,因此不予清理

那如何让GC清理呢?只要对象没有人引用就可以了,例如:

[java] view plaincopy

publicclassTest{

publicvoidfinalize(){System.out.println("finalize!");};

publicstaticvoidmain(String[]args){

//TODOAuto-generatedmethodstub

Testt=newTest();

t=null;

System.gc();

}

}

只要把对象引用t置空,再用System.GC通知GC开始回收,GC会发现Test对象已经没有人使用了,

就会开始清理,同时触发了finalize方法。

那假设我没有显式的返回对象引用,只是new对象出来,例如:

把Test t = new Test(); 换成new Test();,GC会怎么考虑呢?

答案是GC认为这东西没人用 :)

阅读(836) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~