介紹:
Cleaner是JDk1.9之后提供的一個對象清理操作,主要的功能是進行finialize()方法的替代。
輸入Java因為自身JVM的特性不用用戶自己去回收垃圾,但是仍然存在此類操作。
public class Member { public Member(){ System.out.println("誕生!"); } @Override protected void finalize() throws Throwable{//從JDk1.9開始不建議使用
System.out.println("回收:必死");
throw new Exception("不想死"); }
}
public class Main { public static void main(String[] args) { Member mm = new Member(); // 誕生
mm = null; // 成為垃圾
System.gc(); System.out.println("死亡並不結束!"); } }
從JDk1.9開始不建議使用finialize()方法,從而建議使用AutoCloseable或者Cleaner進行處理。
新版本的清除操作:
public class Member implements Runnable{ public Member(){ System.out.println("【構造】Born"); } @Override public void run() { // 執行清除的時候,執行的是此操作
System.out.println("【回收】Death"); } }
import java.lang.ref.Cleaner; public class MemberCleaning implements AutoCloseable{ // 實現清除
private static final Cleaner cleaner = Cleaner.create(); // 創建清除處理
private Member member; private Cleaner.Cleanable cleanable; public MemberCleaning() { this.member = new Member(); this.cleanable = this.cleaner.register(this,this.member); // 注冊使用的對象
} @Override public void close() throws Exception { this.cleanable.clean(); // 啟動多線程
} }
public class Main { public static void main(String[] args) throws Exception{ try (MemberCleaning mc = new MemberCleaning()){ // 中間可以執行一些相關的代碼
}catch (Exception e){ } } }
新一代的清除回收操作,考慮的是多線程的使用:
為了防止可能造成的多線程的延遲處理,許多對象回收前的處理都是單獨通過一個線程完成的,這樣能夠保證執行性能的提高。