java中的对象有三种状态,1:激活,2:去活,3:死亡。当一个对象有一个或者多个对象引用时,他处于激活状态。当一个对象没有引用指向他时,他将变成去活状态。当一个对象处于去活状态时,系统垃圾回收器准备回收该对象时,会先调用该对象的finalize方法,如果finalize方法中,该对象没有被重新引用,那么他将变成死亡状态,如果有其他引用,他重新变成激活状态。死亡状态:当对象没有被其他对象引用,且已经调用过了finalize方法(也没有让其变为激活状态),那么系统才真正的回收其内存资源。
java中的对象没有必要由程序员手动删除,由垃圾回收器回收,可是垃圾回收器回收的时间往往具有不确定性。因此我们可以通过system.gc()方法或者Runtime.getRuntime().gc(),提醒垃圾回收器该回收垃圾了,记住只是提醒而已,至于垃圾回收器什么时候回收还是不确定的,只不过他会尽量快的进行回收。
下面的代码演示了finalize方法中如何激活本身,和知道垃圾回收的不确定性。
public class Test1 {
private static Test1 a = null ;
void info()
{
System.out.println("测试finalize()方法");
}
@Override
protected void finalize() throws Throwable {
//使this对象重新变成激活状态
a=this;
}
public static void main(String[] args) throws InterruptedException {
new Test1();
//告诉垃圾回收器该收垃圾了
System.gc();
//没有这句的话,系统没有没有清理垃圾,那么就不会调用finalize方法,a对象为null,告诉我们并不是调用System.gc();
//后,垃圾回收器就马上开始回收垃圾了
Thread.sleep(2000);
//调用静态成员的info方法
a.info();
}
}
我们也可以强制垃圾回收器执行去活对象的finalize方法,通过调用system.runFinalization()方法,下面的代码和上面的代码一样,只不过不用线程休眠2s,垃圾回收器也会调用去活对象的finalizde方法。
public class Test1 {
private static Test1 a = null ;
void info()
{
System.out.println("测试finalize()方法");
}
@Override
protected void finalize() throws Throwable {
//使this对象重新变成激活状态
a=this;
}
public static void main(String[] args) throws InterruptedException {
new Test1();
//告诉垃圾回收器该收垃圾了
System.gc();
//没有这句的话,系统没有没有清理垃圾,那么就不会调用finalize方法,a对象为null,告诉我们并不是调用System.gc();
//后,垃圾回收器就马上开始回收垃圾了
// Thread.sleep(2000);
//垃圾回收器强制回收回收垃圾
System.runFinalization();
//调用静态成员的info方法
a.info();
}
}