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

news2024/11/24 16:22:00

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);
    }

    @Override
    public String toString() {
        return user.toString();
    }

    @Override
    public void close() {
        cleaner.clean();
    }

    @EqualsAndHashCode
    @ToString
    private static class _User implements Runnable {
        private final String id;

        public _User() {
            id = IdWorker.get32UUID();
        }

        @Override
        public 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());
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                '}';
    }

    @EqualsAndHashCode
    @ToString
    private static class State implements Runnable {

        public State() {
            System.out.println("[构造中...]: 这里一般通过参数获取堆外内存地址等信息。");
        }

        @Override
        public 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());
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                '}';
    }

    @Override
    public void close() {
        // Cleaner.Cleanable
        cleanable.clean();
    }


    @EqualsAndHashCode
    @ToString
    private static class State implements Runnable {

        public State() {
            System.out.println("[构造中...]: 这里一般通过参数获取堆外内存地址等信息。");
        }

        @Override
        public 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. 结果测试

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/65463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ChatGPT成精了!

最近几天,朋友圈、公众号都被 ChatGPT 刷屏了。 更有不少标题党吹嘘 “谷歌要完,百度也危了”。 那么它到底有没有网上吹的这么神奇呢? 我亲测了一把,感觉确实非常惊艳! 例如: 看着还不错,每…

20221206英语学习

今日新词: outwards adv.向外, 朝外 outrage n.义愤,愤慨;暴行,骇人听闻的事件 drown v.淹没, 溺死, 浸透, 浸泡 visit n.访问, 参观, 看望, 游览 setting n.环境, 背景, (戏剧、小说等的)情节背景&am…

面试题: Hive-SQL查询连续活跃登录用户思路详解

文章目录创造数据登录日志去重一、思路一1.1、分组排序1.2、日期减去计数值得到结果, 用户连续登陆情况下,每次相减的结果都相同1.3、根据 user_id 和 dis 分组,得到用户的 开始、结束时间、连续登录天数1.4、连续登录超过两天用户二、思路二&#xff1a…

【Rust日报】2022-12-05 探索 docker 的 WASM 技术预览

探索 docker 的 WASM 技术预览docker于近日发布了支持 WASM 容器的预览版本,本文带你体验使用 Rust 编写代码,并且编译成 WASM 最终运行于 docker 的过程.原文链接: https://medium.com/shyamsundarb/exploring-docker-hubs-wasm-technical-preview-76de28c3b1b4使用 Rust 破解…

Matlab学习——变量与档案存取

一、变量 1. char和string MATLAB里面的字符和字符串都是用单引号括起来的。 % 示例:aI like China; n0; for n1:1:size(a,2)b(size(a,2)-n1)a(n); end disp(a); disp(b);% 输出:>> work I like China anihC ekil I >> % 示例&#xff…

Dockerfile的常用指令和构建案例

一、Dockerfile操作常用的指令 (1) FROM 镜像 指定新镜像所基于的基础镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令 (2) MAINTAINER 名字 说明新镜像的维护人信息 (3) RUN命令 在所基于的镜像上执行命令,并提交到新的…

B2B商城交易平台搭建方案为专用设备行业注入新动力,加快产业数字化转型升级

专用设备是指设备的结构、性能专门针对某一种或一类对象,实现一项或几项功能的工业,包括工程机械、光伏设备、锂电设备、3C设备、半导体设备等。近年来,受市场对专用设备的应用需求不断扩大、产业技术升级趋势加快等影响,我国专用…

直播回顾:Coremail校园邮件安全防护交流会暨新技术应用分享

11月23日,Coremail校园邮件安全防护交流会暨新技术应用分享直播举办。 Coremail作为国内TOP级邮件系统厂商,服务上百家高校,特邀以下重磅嘉宾参与了本次圆桌讨论。 本次圆桌会主要探讨校园典型钓鱼邮件防范与新技术在校园邮件中的应用。 高校…

mysql 查询在一张表不在另外一张表的记录

SQL Join子句,主要用在select语句中,把两个或多个表的行结合起来,基于这些表之间的共同字段(往往是id字段)来查询,从多个表中返回满足条件的所有行。 常见join子句类型 常见join子句类型有INNER JOIN(同JOIN)、LEFT JOIN、RIGHT…

【Java学习Note】第8章 多线程

8. 多线程 文章目录8. 多线程8.1 程序、进程、线程8.2 线程的创建8.2.1 继承Thread类-创建线程方法之一8.2.2 Thread常用方法8.2.3 实现Runnable接口-创建线程方法之二8.2.4 两种多线程的区别8.3 线程得调度8.4 线程的生命周期8.5 线程的同步8.5.1 线程同步--Synchronized8.5.2…

html网页设计与制作:基于html设计整套招聘网站求职前端模板页面 静态网页HTML代码 学生网页课程设计期末作业下载

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

联通边缘AI:打造“职业技能”,助力行业高质量发展

内容来源:2022年11月12日,由边缘计算社区主办的全球边缘计算大会上海站圆满落幕。我们非常荣幸邀请到了联通数科首席AI科学家廉士国博士来分享,廉博士是中国图像图形学会三维视觉专委会委员、IEEE智能计算及多媒体通信委员会委员、国家工业互…

WSL VSCode运行C++项目

WSL VSCode运行C项目collect2: error: ld returned 1 exit statusboost库的链接安装并编译boost库:链接库(!!这一步有错误,下面会改正)/usr/include/boost/python/detail/wrap_python.hpp:57:11: fatal error: pyconfig.h: No suc…

RK3588平台开发系列讲解(SARADC篇)SARADC的工作流程

平台内核版本安卓版本RK3588Linux 5.10Android12🚀返回专栏总目录 文章目录 一、SARADC驱动二、SARADC常用接口三、SARADC源码分析1、SARADC驱动注册2、用例分析沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍SARADC的源码分析和工作流程。 一、SARADC驱…

【Flink】需求实现之独立访客数量的计算 和 布隆过滤器的原理及使用

文章目录一 独立访客数量计算二 布隆过滤器1 什么是布隆过滤器2 实现原理(1)HashMap 的问题(2)布隆过滤器数据结构3 使用布隆过滤器去重一 独立访客数量计算 public static void main(String[] args) throws Exception{StreamExe…

Locust学习记录3-用户类属性【host attribute,tasks attribute】

host attribute(主机属性) host属性是家长主机的URL前缀(即“https://www.baidu.com”)。 这是在Locust的web UI 或命令行上指定的,在Locust【--host】启动时使用该选项 【--host】如果在用户类中声明了一个host属性,那么在命令…

答网友提问 - SAP Business Technology Platform(BTP) 的计费模式

我的知识星球 有朋友向我提问: S4HANA(本地部署或云版)跟SAP家族系统以及非SAP系统的集成,sap的标准/推荐做法是通过BTP还是直接连接,或者是根据目标系统分别选择?有参考链接最好了。 还有BTP的收费模式是什么样的,是不…

业聚医疗通过聆讯:上半年营收6885万美元 钱永勋为实控人

雷递网 雷建平 12月5日血管介入器械公司――业聚医疗集团有限公司(OrbusNeich Medical Group Limited)(简称“业聚医疗”)日前通过聆讯,准备在香港上市。上半年营收6885万美元业聚医疗总部位于中国香港,是一…

springboot解决跨域问题

springboot解决跨域问题 文章目录springboot解决跨域问题一、跨域是什么?二、java解决CORS请求的方式1.返回新的CORSFilter(全局跨域)2.重写WebMvcConfigurer(全局跨域)3.使用注解CorsOrigin4.手动设置响应头&#xff…

如何安装Ambari集群_大数据培训

注意:以下操作主节点操作即可 1 制作本地源 制作本地源是因为在线安装Ambari太慢。制作本地源只需在主节点上进行。 1.1 配置HTTPD 服务 配置HTTPD 服务到系统层使其随系统自动启动 [roothadoop102 ~]# chkconfig httpd on [roothadoop102 ~]# service httpd …