常用類庫----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("太陽照常升起,地球照樣轉動,一代更比一代強!");// 不受影響繼續執行
	}
}

執行結果

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

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章