对象与垃圾回收

       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();
   }
}
    

     

你可能感兴趣的:(java,String,测试,null,Class)