JVM系列(六) JVM 对象终结方法finalize

这篇具有很好参考价值的文章主要介绍了JVM系列(六) JVM 对象终结方法finalize。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我们有几个特别容易混淆的关键字final、finally、finalize, 他们之间的区别是什么?

  • final 是java关键字
  • finally 是try-catch-finally
  • finalize 是Object 根类的方法

今天我们着重讲下 finalize方法

1.finalize方法的原理及调用

finalize方法也是Java中所有类中必有的方法,因为它是属于Object根类的方法,默认情况下,Java中所有的类都是Object类的子类。

  • 在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。
  • finalize()方法可以处理系统资源,执行清理活动并最大程度地减少内存泄漏。
  • 简单来说可在释放对象前进行某些操作

那么什么时候调用 finalize方法呢?

  1. 当对象被回收时,系统自动调用该对象的finalize方法,子类可以重写该方法,做一些释放资源的操作。
  2. 什么时候被回收:当某个对象没有任何引用时,jvm就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象
  3. 在销毁对象前,会先调用finalize方法。
  4. 垃圾回收机制的调用,是由系统来决定,也可以通过System.gc()主动触发垃圾回收机制。
  5. 并不是说有一个垃圾对象,垃圾回收器立马回收,它有一套自己的算法
2.finalize方法测试

创建MyBigObject 重写 finalize方法
在对象销毁前,或者释放资源前 加入自己的操作


@Slf4j
public class MyBigObj {
    private String name;

    public MyBigObj(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    @Override
    public String toString() {
        return "MyBigObj{" +
                "name='" + name + ''' +
                '}';
    }

    /**
     * 子类重写此方法,可在释放对象前进行某些操作
     */
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("==========加入某些操作! 释放了资源");
    }

}

然后创建测试类, 构建对象

手动执行GC, 释放系统资源, 触发垃圾回收

@Slf4j
public class FinalTest {

    public static void main(String[] args) throws Exception {

        //测试finalize
        MyBigObj obj = new MyBigObj("aaa");
        log.info("======obj:" + obj);

        //将 obj 对象置为 null, 此刻obj对象实体就是垃圾对象
        // obj 等待被回收。但是 回收的时间不确定。
        obj = null;


        //强制性释放空间
        System.gc();

        Thread.sleep(1000);
        log.info("======obj:" + obj);
    }
}
查看finalize方法执行结果

执行结果

  • 先创建对象 MyBigObj{name=‘aaa’}
  • 然后 将obj 设置为null,变为可回收对象
  • 然后执行 gc主动释放对象,触发垃圾回收
  • 然后 执行 obj.finalize方法 打印 加入某些操作! 释放了资源
  • 然后打印 obj 对象 =null
21:53:31.523 [main] INFO com.jzj.tdmybatis.util.FinalTest - ======obj:MyBigObj{name='aaa'}
==========加入某些操作! 释放了资源
21:53:32.538 [main] INFO com.jzj.tdmybatis.util.FinalTest - ======obj:null
3.finalize终结方法的应用场景

下面我们介绍一下 finalize终结方法的应用场景

  • JVM的垃圾回收会负责调用这个方法。
  • finalize 不像equals()和toString(),equals()和toString()方法是需要你写代码调用的
  • finalize()只需要重写,重写完将来自动机制来调用。
  • 当一个java对象即将被垃圾回收器回收的时候,垃圾回收器负责调用finalize()方法。
  • 象销毁时机执行一段业务逻辑,这段逻辑要写在finalize()方法当中。
  • java 中的垃圾回收器不是轻易启动的,垃圾太少,或者时间没到,种种条件下,有可能启动,也有可能不启动
  • 因此finalize方法的执行时刻也是不确定的

至此 我们讲明白了finalize终结方法的使用及调用时机,便于我们理解 jvm在回收垃圾时候的操作流程文章来源地址https://www.toymoban.com/news/detail-402741.html

到了这里,关于JVM系列(六) JVM 对象终结方法finalize的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 谷歌裁员千人,搅动硅谷!终身编程终结,我们何以苟活?

    新年第一个月,硅谷爆发了新一轮裁员潮。在这波浪潮中,有消息称谷歌计划裁员千人,另有Meta、Unity、Discord等多家公司也陆续放出了裁员的消息。就当前的就业环境来说,技术人员似乎面临着极其严峻的考验。 过去的一年间,生成式AI发展迅猛。AI在代码能力上的飞跃让人

    2024年01月16日
    浏览(35)
  • 微信小程序有几个文件

    微信小程序通常由多个文件组成,主要包括以下几种类型的文件: JSON 配置文件: app.json: 整个小程序的全局配置,包括页面路径、窗口样式、网络超时时间等。 page.json: 单个页面的配置,用于指定该页面的窗口样式、导航栏样式等。 project.config.json: 小程序项目的开发工具配

    2024年02月03日
    浏览(37)
  • root查询有几个用户,查看root用户

    1、使用w命令查看登录用户正在使用的进程信息 Linux w命令用于显示目前登入系统的用户信息。 执行这项指令可得知目前登入系统的用户有哪些人,以及他们正在执行的程序。 单独执行w指令会显示所有的用户,您也可指定用户名称,仅显示某位用户的相关信息。 语法:www.

    2024年02月02日
    浏览(40)
  • 软件生命周期阶段有几个?常见软件生命周期模型有哪些?

    软件生命周期阶段及常见的软件生命周期模型,软件生命周期是指一个计算机软件从功能确定、设计,到开发 成功投入使用,并在使用中不断地修改、增补和完善,直到停止该软件的使用的全过程。 生命周期 从收到应用软件开始算起,到该软件不再使用为止。 它有以下几方

    2024年02月03日
    浏览(59)
  • ChatGPT有几个版本,哪个版本最强,如何选择适合自己的?

      ​ChatGPT就像内容生产界的瑞士军刀。它可以是数学导师、治疗师、职业顾问、编程助手,甚至是旅行指南。只要你知道如何让它做你想做的事,ChatGPT几乎可以提供你要的任何东西。 但重要的是,你知道哪个版本的ChatGPT最能满足你的需求吗?虽然所有可用版本之间没有显著

    2024年02月15日
    浏览(122)
  • 如何将项目(工程/代码)文件上传到gitee?(注意一下,有几个坑)

    折腾了半个下午,碰到了一些bug,于是写一篇博客说道说道。 git官网链接:https://git-scm.com/ 如果官网打不开或者很卡的话,去git国内镜像网站下载。 git国内镜像网站地址:https://registry.npmmirror.com/binary.html?path=git-for-windows/ 下载自己系统对应的版本即可,此处不再啰嗦,自行下

    2023年04月09日
    浏览(44)
  • 当你有几个技术博客时,如何一键分发到多个技术博客平台?

    如果你写博客,你一定会遇到这样一个问题,我在掘金写了一篇文章,想要发到其他的平台每次都有复制粘贴,还经常遇到格式不匹配、图片复制不过去等各种问题。可真是头大呀 接下来就给你介绍一个非常王炸的工具,只要把你写的文章编辑一次,就可以导出分发。 专门

    2024年02月08日
    浏览(49)
  • 【jvm系列-06】深入理解对象的实例化、内存布局和访问定位

    JVM系列整体栏目 内容 链接地址 【一】初识虚拟机与java虚拟机 https://blog.csdn.net/zhenghuishengq/article/details/129544460 【二】jvm的类加载子系统以及jclasslib的基本使用 https://blog.csdn.net/zhenghuishengq/article/details/129610963 【三】运行时私有区域之虚拟机栈、程序计数器、本地方法栈 https

    2023年04月16日
    浏览(84)
  • Unity之获取游戏物体对象或组件的几个方法

    在unity的实际项目开发中,往往都要获取游戏内的各种物体,比如玩家(Player),怪物(Monster),或者其他,那有什么方法可以快速获取呢,下面就来介绍unity获取游戏对象的几个方法 GameObject.Find GameObject.Find 通过游戏物体的名称获取对象 使用方法 缺点: 会遍历当前整个场

    2024年02月01日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包