gc只负责回收堆内存中的对象,不会回收任何物理资源(例如数据库连接和网络IO等);程序无法精确控制垃圾回收,就算调用了System.gc()也一样只是通知程序可以进行垃圾回收,但是日期还是不确定的,只是会尽快回收垃圾,垃圾回收之前一般会调用finalize方法。对象一般有三种状态,可达,可恢复,不可达。可达不用说了,可恢复即回收对象之前调用finalize方法重新让一个引用变量引用这个对象。则此对象会再次变为可达状态,否则就不可达。注意:永远不要主动调用finalize方法,应该留给垃圾回收机制调用,而且具有不确定性,finalize可以使一个对象重新可达,此方法出现异常时,垃圾回收机制不会报告异常,程序继续执行。方法来自Object,protected void finalize()throw Throwable。
public class test{
. .private static test t=null;
. .public void info(){System.out.pritln("asd");}
. .public static void main(){
.. .. new test(); System.gc();
.. ..Thread.sleep(2000);//假如没有这一行,调用下面的方法就会异常,因为执行了gc后并未立马进行垃圾回收使得ft重新在finalize里可达,停止两秒后以让程序执行ft=this代码
.. ..//当然上面的sleep可以不用,改为System.runFinalization()有同样效果,即强制垃圾回收机制调用finalize方法以使ft可达。
. .ft.info();
.. ..}
public void finalize(){ft=this;]//重新变成可达对象。
}