Java中对象的finalization机制
本篇文章我们详细介绍Java中对象的finalization机制,以及怎么使用finalize()方法,将即将被回收的对象,拉回来。
1、finalization机制
Java语言提供了对象终止(finalization)机制来允许开发人员提供对象被销毁之前的自定义处理逻辑。
当垃圾回收器发现没有引用指向一个对象,即:垃圾回收此对象之前,总会先调用这个对象的finalize()方法。
finalize() 方法允许在子类中被重写,用于在对象被回收时进行资源释放。通常在这个方法中进行一些资源释放和清理的工作,比如关闭文件、套接字和数据库连接等。

永远不要主动调用某个对象的finalize()方法,应该交给垃圾回收机制调用。理由包括下面三点:
在finalize()时可能会导致对象复活。
finalize()方法的执行时间是没有保障的,它完全由GC线程决定,极端情况下,若不发生GC,则finalize()方法将没有执行机会。
一个糟糕的finalize()会严重影响GC的性能(finalize方法中有死循环等)。
从功能上来说,finalize()方法与C中的析构函数比较相似,但是Java采用的是基于垃圾回收器的自动内存管理机制,所以finalize()方法在本质上不同于C中的析构函数。
由于finalize()方法的存在,虚拟机中的对象一般处于三种可能的状态。
如果从所有的根节点都无法访问到某个对象,说明对象己经不再使用了。一般来说,此对象需要被回收。但事实上,也并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段。一个无法触及的对象有可能在某一个条件下“复活”自己,如果这样,那么对它的回收就是不合理的,为此,定义虚拟机中的对象可能的三种状态。如下:
可触及的:从根节点开始,可以到达这个对象。
可复活的:对象的所有引用都被释放,但是对象有可能在finalize()中复活。
不可触及的:对象的finalize()被调用,并且没有复活,那么就会进入不可触及状态。不可触及的对象不可能被复活,因为finalize()只会被调用一次。
以上3种状态中,是由于finalize()方法的存在,进行的区分。只有在对象不可触及时才可以被回收。
具体过程
判定一个对象objA是否可回收,至少要经历两次标记过程:
①、如果对象objA到GC Roots没有引用链,则进行第一次标记。
②、进行筛选,判断此对象是否有必要执行finalize()方法
③、如果对象objA没有重写finalize()方法,或者finalize()方法已经被虚拟机调用过,则虚拟机视为“没有必要执行”,objA被判定为不可触及的。
④、如果对象objA重写了finalize()方法,且还未执行过,那么objA会被插入到F-Queue队列中,由一个虚拟机自动创建的、低优先级的Finalizer线程触发其finalize()方法执行。
⑥、finalize()方法是对象逃脱死亡的最后机会,稍后GC会对F-Queue队列中的对象进行第二次标记。如果objA在finalize()方法中与引用链上的任何一个对象建立了联系,那么在第二次标记时,objA会被移出“即将回收”集合。之后,对象会再次出现没有引用存在的情况。在这个情况下,finalize方法不会被再次调用,对象会直接变成不可触及的状态,也就是说,一个对象的finalize()方法只会被调用一次。
2、代码演示finalize()使用
/*** @author liuchao* @date 2023/3/4*/
public class Test6 {/*** 类变量,属于GC Roots的一部分*/public static Test6 testObj;@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println("调用当前类重写的finalize()方法");testObj = this;}public static void main(String[] args) throws InterruptedException {testObj = new Test6();// 主动删除引用testObj = null;System.gc();System.out.println("-----------------第一次gc操作------------");// 因为Finalizer线程的优先级比较低,暂停2秒,以等待它Thread.sleep(2000);if (testObj == null) {System.out.println("testObj is dead");} else {System.out.println("testObj is still alive");}System.out.println("-----------------第二次gc操作------------");// 主动删除引用testObj = null;System.gc();// 下面代码和上面代码是一样的,但是 testObj却自救失败了Thread.sleep(2000);if (testObj == null) {System.out.println("testObj is dead");} else {System.out.println("testObj is still alive");}}
}

相关文章:

Java中对象的finalization机制
本篇文章我们详细介绍Java中对象的finalization机制,以及怎么使用finalize()方法,将即将被回收的对象,拉回来。1、finalization机制Java语言提供了对象终止(finalization)机制来允许开发人员提供对象被销毁之前的自定义…...

proteus光敏电阻电路的arduino仿真
虽然Fritzing0.9.10有了仿真的功能,但都是测试板,能够仿真的很有限,所以还是要借助proteus来仿真。这里,我们来实先一个简单的光明电阻的仿真电路。本篇博文,重点演示proteus仿真arduino光敏电阻,arduino采…...
MySql面试精选—慢查询如何优化
目录 1、如何界定是慢查询SQL 2、如何快速定位低效率SQL 1)查看慢SQL语句...

一款OutLook信息收集工具
OutLook 这是一款burp插件,用于Outlook用户信息收集,在已登录Outlook账号后,可以使用该 插件自动爬取所有联系人的信息 安装 在burp扩展面板加载jar即可 功能介绍 All Users 加载插件后,进入Outlook联系人面板,…...

java多线程(二一)并发协作生产者消费者设计模式
1.两个线程一个生产者一个消费者 需求情景 两个线程,一个负责生产,一个负责消费,生产者生产一个,消费者消费一个。 涉及问题 同步问题:如何保证同一资源被多个线程并发访问时的完整性。常用的同步方法是采用标记或加…...

Win YAPI + Jenkins 实现接口自动化测试
自动化测试 传统的接口自动化测试成本高,大量的项目没有使用自动化测试保证接口的质量,仅仅依靠手动测试,是非常不可靠和容易出错的。 为了解决这个问题,使用YAPI接口自动化测试功能,只需要配置每个接口的入参和对 RE…...

【计算机视觉 自然语言处理】什么是多模态?
文章目录一、多模态的定义二、多模态的任务2.1 VQA(Visual Question Answering)视觉问答2.2 Image Caption 图像字幕2.3 Referring Expression Comprehension 指代表达2.4 Visual Dialogue 视觉对话2.5 VCR (Visual Commonsense Reasoning) 视觉常识推理…...
2023百度面试真题
【百度】面试真题: 1、SpingBoot 也有定时任务?是什么注解? 在 SpringBoot 中使用定时任务主要有两种不同的方式,一个就是使用 Spring 中的Scheduled 注解,另一个则是使用第三方框架 Quartz。 使用 Spring 中的 Sch…...

MAC(m1)-VMWare Fushion安装Windows11
镜像下载地址:登录 账号:11360XXXXX@qq.com 密码:ZXXXSXX19XX 参考:VMware fusion虚拟机安装Win10系统的详细教程_IT大力水手的博客-CSDN博客_vmware fusion安装 uefi和bios有什么区别?uefi和bios的区别详细分析 _ 电脑系统城 设置密码...

HTML与CSS简介
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 HTML与CSS简介前言一、HTML简单梳理1.HTML文件的书写规范2.常用标签介绍二、CSS简单梳理1、CSS选择器前言 页面由三部分内容组成!分别是内容(结构&am…...

基于Java开发幼儿园管理系统项目教程(附源码)
文章目录你将会学到:适合人群:课程目标:课程简介:软件架构开发环境运行截图你将会学到: 掌握市面上主流框架SpringMvc、Spring、MyBatis、SpringBoot实战开发技巧提升学员代码编码能力和实战项目编码经验熟悉企业级项…...

第一次运行vue遇到的问题
1.vue无法识别https://blog.csdn.net/weixin_61634408/article/details/1265897982.yarn serve问题https://blog.csdn.net/fangxuan1509/article/details/104711690/3.关闭控制台报错检查(每次vue-rounter必须用)vue.config,js,的module.exports 中添加l…...

Clickhouse数据去重
1. Hive去重 先以两个简单的sql启发我们的话题 select count(distinct id)from order_combine;select count(id) from (select id from order_combine group by id ) t;从执行日志当中我们可以看到二者的差异(只摘取关键部分) # distinctStage-Stage…...
精讲typescript从入门到入土
前言 TypeScript是一种由Microsoft开发的编程语言,它是JavaScript的超集,意味着它可以编写与JavaScript完全兼容的代码,并且可以扩展其功能。TypeScript的主要目标是提供类型安全性和更好的可维护性,使得开发大型复杂应用程序更加…...

typora-beta-0.11.18版本又提示过期的解决方案
很实用,所以照搬一下下面的作者的回答,省得以后再找~~~ 知乎的作者来源如下: 作者:吴小皓 链接:typora打开报错:This beta version of Typora is expired, please download and install a newer version …...
WebUI自动化测试框架搭建(二十)-优化:测试对象无法连接或出现异常时,请更新本文作为测试对象
(二十)-测试对象无法连接或出现异常时,请更新本文作为测试对象 1 测试对象说明2 源代码下载3 学生管理系统配置安装3.1 解压打开3.2 安装依赖3.3 安装mysql数据库3.4 修改项目数据库配置3.4 安装数据库连接工具Navicat3.5 导入数据库脚本4 运行学生管理系统5 系统查看1 测试…...

【FATE联邦学习】standalone版Fateboard修改配置
背景&做法 很多其他程序(比如vscode的code server)也会使用这个 127 0 0 1:8080 socket进行通信,这样就没办法远程用vscode去开发了,所以需要修改下Fateboard的socket配置。官方文档中也给出了如何修改配置 The default data…...

分享一个应急响应web日志:access.log文件分析小工具
有时做应急响应的时候,需要提取web日志如access.log日志文件来分析系统遭受攻击的具体原因,由于开源的工具并不是很好用,所以自己用Python3写了一个简单的日志分析工具。先介绍一下access.log日志access.log日志文件记录了所有目标对Web服务器…...
windows注册服务非常实用
方式一:使用Windows自带的sc命令 1、使用管理员权限打开cmd窗口 2、注册服务命令: sc create 服务名 binpath 程序所在路径 type own start auto displayname 服务显示名称 sc create redis binpath d:\tools\redis-x64-5.0.14\redis-server.exe type …...
蓝桥dfs专题
1、dfs 路径打印 小明冒充X星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是 n x n 个方格。【如图1.png】所示。 按习俗,骑士要从西北角走到东南角。 可以横向或纵向移动,但不能…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...