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("太阳照常升起,地球照样转动,一代更比一代强!");// 不受影响继续执行
}
}
执行结果
【构造方法】,电闪雷鸣,一个优秀的人才诞生了!
太阳照常升起,一代更比一代强
【对象回收】大家的终点都是一样的,一路走好!
进行对象释放前,启动了专门的对象清理线程,通过这样来提升对象的回收速度。