常用类库----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("太阳照常升起,地球照样转动,一代更比一代强!");// 不受影响继续执行
	}
}

执行结果

【构造方法】,电闪雷鸣,一个优秀的人才诞生了!
太阳照常升起,一代更比一代强
【对象回收】大家的终点都是一样的,一路走好!

进行对象释放前,启动了专门的对象清理线程,通过这样来提升对象的回收速度。

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