天天看點

常用類庫----15.6Cleaner類

Java對象生命周期

在Java中對象的整個生命周期大緻可以分為7個階段:建立階段(Creation)、應用階段(Using)、不可視階段(Invisible)、不可到達階段(Unreachable)、可收集階段(Collected)、終結階段(Finalized)與釋放階段(Free)

finalize()方法對象回收執行方法,Cleaner類jdk1.9提供

範例:finalize()方法對象回收執行方法

public class Member {
   public Member() {
	   System.out.println("【構造方法】,電閃雷鳴,一個優秀的人才誕生了!");
   }
   @Override
	protected void finalize() throws Throwable {
		System.out.println("【對象回收】大家的終點都是一樣的,一路走好!");
		throw new Exception("我真的還想在活500年");
	}
}


public class JavaAPIDemo347 {
       public static void main(String[] args) {
		Member mem=new Member();  //執行個體化對象
		mem=null;          //垃圾,不被引用
		System.gc();//手動進行gc操作
		System.out.println("太陽照常升起,一代更比一代強");
		
	}
}

           

執行結果

【構造方法】,電閃雷鳴,一個優秀的人才誕生了!
太陽照常升起,一代更比一代強
【對象回收】大家的終點都是一樣的,一路走好!

           

本程式發現,當對象回收前一定會調用finalize()方法進行對象回收前的首收尾操作,但是此類操作也有可能影響JVM的對象配置設定與回收速度,或者可能造成該對象的在次複活,是以jdk1.9後不再推薦此方法。出現新的替代者:java.lang.ref.Cleaner類。此種清理方式會啟動一個新的清理線程,并且基于AutoCloseable接口實作資源釋放。

範例:Cleaner釋放資源

package cn.mldn.demo;
import java.lang.ref.Cleaner;
class Member implements Runnable {
	public Member() {
		System.out.println("【構造方法】電閃雷鳴,一個優秀的人才誕生了!");
	}
	@Override
	public void run() {	// 清除線程
		System.out.println("【對象回收】大家的終點是一樣的,一路走好。");
	}
}
class MemberCleaning implements AutoCloseable { // 實作清除的處理
	private static final Cleaner cleaner = Cleaner.create() ; // 建立一個清除處理
	private Cleaner.Cleanable cleanable ;
	public MemberCleaning(Member member) {	// 注冊待清除對象
    	this.cleanable = cleaner.register(this, member) ;	// 注冊使用的對象
	}
	@Override
	public void close() throws Exception {// 自動關閉并釋放
		this.cleanable.clean(); // 啟動清理線程
	}
}
public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		Member mem = new Member() ;// 執行個體化對象
		System.gc(); 	// 手工進行GC調用
		try (MemberCleaning mc = new MemberCleaning(mem)){/ 中間可以執行一些相關的代碼
		} catch (Exception e) {}
		System.out.println("太陽照常升起,地球照樣轉動,一代更比一代強!");// 不受影響繼續執行
	}
}
           

執行結果

【構造方法】,電閃雷鳴,一個優秀的人才誕生了!
太陽照常升起,一代更比一代強
【對象回收】大家的終點都是一樣的,一路走好!
           

進行對象釋放前,啟動了專門的對象清理線程,通過這樣來提升對象的回收速度。