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("太陽照常升起,地球照樣轉動,一代更比一代強!");// 不受影響繼續執行
}
}
執行結果
【構造方法】,電閃雷鳴,一個優秀的人才誕生了!
太陽照常升起,一代更比一代強
【對象回收】大家的終點都是一樣的,一路走好!
進行對象釋放前,啓動了專門的對象清理線程,通過這樣來提升對象的回收速度。