56.对象的finalization机制、finalize方法理解

2024-05-29 16:38

本文主要是介绍56.对象的finalization机制、finalize方法理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1.对象的`finalization`机制

1.对象的finalization机制

  1. Java提供了finalization机制来允许开发人员提供对象销毁之前自定义处理逻辑。
  2. 垃圾回收一个对象之前,总会先调用这个对象的finalize()方法
  3. finalize()方法是Object类中定义的,允许在任何子类中被重写,用于对象被回收时进行资源释放,例如,关闭数据库连接等等。
    在这里插入图片描述
  4. 不要主动的调用finalize()方法,应该交给垃圾回收机制来调用。
    原因:
    a)finalize()可能导致对象复活
    b)finalize()执行时间没有保障,完全有GC线程决定,极端情况下,若不发生GCfinalize()就不会被调用
    c)糟糕的finalize()会影响GC的性能
    在这里插入图片描述
  5. JVM中的对象可能出现的3种状态。
    a)可触及的:从根节点开始,可以到达这个对象
    b)可复活的:对象的所有引用都被释放,但是对象可能在finalize()被复活(例如:在finalize()中又有新的引用指向该对象)。
    c)不可触及的,对象的finalize()被调用之后,对象没有复活,那么会进入不可触及的状态。不可触及的对象不可能被复活,因为finalize()只会调用一次

只有不可触及的对象才能够被回收。
在这里插入图片描述
判断一个对象是否可以被回收:

  1. 如果objAGC Roots没有引用链,则进行第一次标记。(这里的标记意思是,对象是不可达的,对象可能是可复活的或者不可触及的。)
  2. 进行筛选,判断对象是否需要执行finalize()方法
    1)如果对象objA没有重写finalize()方法,或者finalize()方法已经被虚拟机调用过,则虚拟机认为“没有必要执行finalize()”,objA被判定为不可触及的
    2)如果objA重写了finalize()方法,且还未执行过,那么objA会被插入到F-Queue队列中,由一个虚拟机自动创建的、低优先级的Finalizer线程触发其finalize()方法。
    3) finalize()方法是对象逃脱死亡的最后机会,稍后GC会对F-Queue中的objA对象进行第二次标记,如果objAfinalize()方法中与引用链上的任何一个对象建立了联系(也就是复活了),那么第二次标记时,objA会被移出“即将回收”集合。之后,对象会再次出现没有引用存在的情况,在这个情况下,finalize()方法不会被再次调用,对象会直接变成不可触及状态。因为,一个对象的finalize()方法只会被调用一次。
    在这里插入图片描述
    演示对象的finalization机制的例子:
/*** 测试Object类中finalize()方法,即对象的finalization机制。*/
public class CanReliveObj {public static CanReliveObj obj;//类变量,属于 GC Root//finalize方法只能被调用一次@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println("调用当前类重写的finalize()方法");obj = this;//当前待回收的对象在finalize()方法中与引用链上的一个对象obj建立了联系。 obj是GC Roots,this是当前对象,也就是要被回收的对象。}public static void main(String[] args) {try {obj = new CanReliveObj();// 对象第一次成功拯救自己obj = null;System.gc();//调用垃圾回收器。第一次GC的时候,会执行finalize方法,在finalize方法中,由于obj指向了this,obj变量是一个GC Root,要被回收的对象与引用链上的对象建立了又联系,所以对象被复活了System.out.println("第1次 gc");// 因为Finalizer线程优先级很低,暂停2秒,以等待它Thread.sleep(2000);if (obj == null) {System.out.println("obj is dead");} else {System.out.println("obj is still alive"); // 这句会输出}System.out.println("第2次 gc");// 下面这段代码与上面的完全相同,但是这次自救却失败了obj = null;System.gc(); // 第二次调用GC,由于finalize只能被调用一次,所以对象会直接被回收// 因为Finalizer线程优先级很低,暂停2秒,以等待它Thread.sleep(2000);if (obj == null) {System.out.println("obj is dead"); // 这句会输出} else {System.out.println("obj is still alive");}} catch (InterruptedException e) {e.printStackTrace();}}
}

更多JVM文章请访问我的JVM专栏:
https://blog.csdn.net/u011069294/category_10113093.html

这篇关于56.对象的finalization机制、finalize方法理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1014065

相关文章

Window Server2016加入AD域的方法步骤

《WindowServer2016加入AD域的方法步骤》:本文主要介绍WindowServer2016加入AD域的方法步骤,包括配置DNS、检测ping通、更改计算机域、输入账号密码、重启服务... 目录一、 准备条件二、配置ServerB加入ServerA的AD域(test.ly)三、查看加入AD域后的变

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

Python中使用defaultdict和Counter的方法

《Python中使用defaultdict和Counter的方法》本文深入探讨了Python中的两个强大工具——defaultdict和Counter,并详细介绍了它们的工作原理、应用场景以及在实际编... 目录引言defaultdict的深入应用什么是defaultdictdefaultdict的工作原理

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Oracle数据库使用 listagg去重删除重复数据的方法汇总

《Oracle数据库使用listagg去重删除重复数据的方法汇总》文章介绍了在Oracle数据库中使用LISTAGG和XMLAGG函数进行字符串聚合并去重的方法,包括去重聚合、使用XML解析和CLO... 目录案例表第一种:使用wm_concat() + distinct去重聚合第二种:使用listagg,

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制