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

2023-10-26

我们有几个特别容易混淆的关键字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在回收垃圾时候的操作流程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM系列(六) JVM 对象终结方法finalize 的相关文章

随机推荐

  • linuxptp源码研究

    目录 1 检查网卡是否支持相应的时间戳 2 linuxptp的目录架构 3 ptp4l的大致流程分析 4 gptp协议对应的sync follow up delay request delay response消息在代码的位置 5 slav
  • Deeplearning4j 实战 (13):基于TextCNN的文本分类实现

    Eclipse Deeplearning4j GitChat课程 Deeplearning4j 快速入门 专栏Eclipse Deeplearning4j 系列博客 万宫玺的专栏 wangongxi CSDN博客Eclipse Deeple
  • java native

    1 java lang Boolean中没有 native方法2 java lang Character中没有native方法3 java lang Byte中没有本地方法4 java labg Short中没有本地方法5 java lan
  • Go语言学习笔记(六)---map

    4 7 map map是key value数据结构 又称为字段或者给关联数组 类似其他编程语言的集合 映射 基本语法 var map变量名 map keytype valuetype keytype可以是bool int string 指针
  • ubuntu 忘记root密码

    方法一 如果用户具有sudo权限 那么直接可以运行如下命令 sudo su root 输入当前用户的密码 passwd 输入密码 再次输入密码 方法二 如果用户不具备sudo权限 则方法一不能用 并需进入GRUB修改kernel镜像启动参数
  • 如何用 Python 批量循环读取 Excel ?

    在使用 Python 批量处理 Excel 时经常需要批量读取数据 常见的方式是结合glob模块 可以实现将当前文件夹下的所有csv批量读取 并且合并到一个大的DataFrame中 df list for file in glob glob
  • 贪吃蛇(C语言)

    贪吃蛇项目 核心算法 循环数组 发牌算法 二维坐标一维化 编译环境 TC 2 0 准备工作 学习gotoxy 函数 了解bioskey 函数使用 知道bioskey 1 与bioskey 0 的区别 了解键盘扫描码 并且知道如何使用 核心工
  • Java读取ini文件

    Java读取ini文件 文章目录 Java读取ini文件 1 ini文件 2 代码示例 1 ini文件 src config config ini文件内容如下 login autorun n jls 2 url 10 10 1 29 por
  • Linux高性能服务器编程(4)TCP协议详解

    Linux高性能服务器编程 4 TCP协议 TCP服务的特点 TCP协议更靠近应用层 在应用程序中有更好的可操作性 信息 作用 TCP头部 TCP头部信息出现在每个TCP报文段中 用于指定通信的源端端口号 目的端口号 管理TCP连接 控制两
  • unity 动态修改文本方法 GameObject

    using System Collections using System Collections Generic using UnityEngine using UnityEngine SceneManagement using Unit
  • linux文件系统

    这本阿里P8撰写的算法笔记 再次推荐给大家 身边不少朋友学完这本书最后加入大厂 Github 疯传 史上最强悍 阿里大佬 LeetCode刷题手册 开放下载了 从操作系统的角度详解Linux文件系统层次 文件系统分类 文件系统的存储结构 不
  • List中存储实体类并根据实体类的指定属性去重

    场景 如果List中存储的是一些字符串 去重的时候就比较简单 直接使用java中的set集合去重即可 如果List中存储的是一些是实体类 去重的时候 要根据实体类的部分属性去重 可以使用下面的方法 举例如下 实体类 public class
  • 服务器迁移记录

    服务器迁移记录 安装 Docker 使用 Docker 安装 MySQL Redis 等 MySQL数据库迁移 文件迁移 安装 Docker 具体安装方法见 Docker 学习笔记 使用 Docker 安装 MySQL Redis 等 My
  • 机顶盒天线接头怎么接_数字电视接收天线怎么安装

    如今越来越多的家庭都在使用数字电视信号 因为这是一种使用起来非常方便 而且画质超级清楚的电视信号 不过很多第一次使用数字电视信号的朋友 并不是特别清楚数字电视接收天线的安装方法 所以我们今天在这里来给大家简单的介绍一下 数字电视接收天线的安
  • 贪心算法与近似算法

    1 贪心算法 1 1 教室调度问题 假设有如下课程表 你希望将尽可能多的课程安排在某间教室上 你没法让这些课都在这间教室上 因为有些课的上课时间有冲突 你希望在这间教室上尽可能多的课 如何选出尽可能多且时间不冲突的课程呢 这个问题好像很难
  • html左侧导航栏右侧显示内容

    效果图 代码 复制下来直接运行就可以
  • 计算机视觉

    手写字体的检测 1 Adaboost进行手写字体的检测 导入mnist数据集 import tensorflow examples tutorials mnist input data as input data data dir MNIS
  • QT的Frame背景图片设置自学版

    1 新建一个qt rescource file file gt new file gt qt gt name path设置 gt 包括所需主项目 gt finish 2 edit gt resource 3 add gt add prefi
  • 微信小程序如何循环控制一行显示几个wx:for

    正如上图所显示的一样 我们改如何控制一行显示几个图形呢 首先第一种方法 数量少的可以自己一行一行的写 但是当数据很多的时候呢 这时候就需要我们区使用循环进行代码的编写 废话不多数 直接写代码 demo item width 40 demo
  • JVM系列(六) JVM 对象终结方法finalize

    我们有几个特别容易混淆的关键字final finally finalize 他们之间的区别是什么 final 是java关键字 finally 是try catch finally finalize 是Object 根类的方法 今天我们着重