Java - Object#finalize在JDK9中被标记废弃了!
创始人
2024-03-21 05:21:19

Java - Object#finalize在JDK9中被标记废弃了!

时间:2022年12月6日01:34:10
目录:
① 为什么要废弃?
② 废弃后,使用什么方式主动监测对象是否被回收?


一、为什么要废弃?

⚡注意:废弃≠移除

在这里插入图片描述
在这里插入图片描述


二、可以使用什么方法检测对象被回收呢?(使用Cleaner✔️)

  • 可参考源码:DirectByteBuffer⚡⚡⚡
    • import jdk.internal.ref.Cleaner;
    • –add-opens java.base/jdk.internal.ref=ALL-UNNAMED → 请继续阅读【三】,将会使用另一个Cleaner🚀

Cleaner使用示例:

import java.util.concurrent.TimeUnit;public class CleanerTest {public static void main(String[] args) {User user1 = new User();User user2 = new User();System.out.println(user1);System.out.println(user2);System.gc();user1 = user2 = null;System.gc();try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { throw new RuntimeException(e); }}
}或者public class CleanerTest {public static void main(String[] args) {try (User user1 = new User();User user2 = new User();) {System.out.println(user1);System.out.println(user2);}}
}
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import jdk.internal.ref.Cleaner;
import lombok.EqualsAndHashCode;
import lombok.ToString;import java.io.Closeable;@EqualsAndHashCode
public class User implements Closeable {private final Cleaner cleaner;private final _User user;public User() {user = new _User();cleaner = Cleaner.create(this, user);}@Overridepublic String toString() {return user.toString();}@Overridepublic void close() {cleaner.clean();}@EqualsAndHashCode@ToStringprivate static class _User implements Runnable {private final String id;public _User() {id = IdWorker.get32UUID();}@Overridepublic void run() {System.out.printf("哦不! 我(%s)要被回收了!%n", id);}}
}

三、两个Cleaner!(推荐使用 java.lang.ref.Cleaner + Closeable)

在这里插入图片描述
在这里插入图片描述

1.使用Cleaner示例(推荐):
import java.util.concurrent.TimeUnit;public class CleanerTest {public static void main(String[] args) {User user1 = new User();User user2 = new User();System.out.println(user1);System.out.println(user2);System.gc();user1 = user2 = null;System.gc();try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { throw new RuntimeException(e); }}
}
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import lombok.EqualsAndHashCode;
import lombok.ToString;import java.lang.ref.Cleaner;@EqualsAndHashCode
public class User {private final String id;private final Cleaner cleaner = Cleaner.create();private final Cleaner.Cleanable cleanable;public User() {this.id = IdWorker.get32UUID();cleanable = cleaner.register(this, new State());}@Overridepublic String toString() {return "User{" +"id='" + id + '\'' +'}';}@EqualsAndHashCode@ToStringprivate static class State implements Runnable {public State() {System.out.println("[构造中...]: 这里一般通过参数获取堆外内存地址等信息。");}@Overridepublic void run() {System.out.println("[回收中...]:这里一般根据堆外内存地址等信息,完成堆外内存释放。");}}
}


官方还推荐将要特定被回收的类实现Closeable接口,用于资源自动回收

import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import lombok.EqualsAndHashCode;
import lombok.ToString;import java.io.Closeable;
import java.lang.ref.Cleaner;@EqualsAndHashCode
public class User implements Closeable {private final String id;private final Cleaner cleaner = Cleaner.create();private final Cleaner.Cleanable cleanable;public User() {this.id = IdWorker.get32UUID();cleanable = cleaner.register(this, new State());}@Overridepublic String toString() {return "User{" +"id='" + id + '\'' +'}';}@Overridepublic void close() {// Cleaner.Cleanablecleanable.clean();}@EqualsAndHashCode@ToStringprivate static class State implements Runnable {public State() {System.out.println("[构造中...]: 这里一般通过参数获取堆外内存地址等信息。");}@Overridepublic void run() {System.out.println("[回收中...]:这里一般根据堆外内存地址等信息,完成堆外内存释放。");}}
}
public class CleanerTest {public static void main(String[] args) {try (User user1 = new User();User user2 = new User();) {System.out.println(user1);System.out.println(user2);}}
}
2. 结果测试

在这里插入图片描述

相关内容

热门资讯

职业规划是生活方式的选择 应届...   为什么说职业规划是生活方式的选择呢?大家可以通过下面这篇文章区了解。   职业规划即职业生涯规划...
如何做职业规划 如何做职业规划...   职业规划的意义在于帮助你准确评价自身的特点和优势,定位自己的职业方向,确立人生的目标,提供奋斗的...
职业规划不可获取的10要素 张...   我们如何才能制定出完美的职业规划呢?毋庸置疑,下面这10要素是必不可少的。   一、无论你现在或...
大学四年,你做“规划”了吗? ...   大学生活,总是从这样的九月开始。从12年的寒窗,到4年后的毕业,12+4,这个公式可以计算出你的...
职业生涯规划的设计要点 中职生...   职业生涯规划的设计通常都由审视自我、确立目标、生涯策略、生涯评估四个环节组成。   首先,有效的...