Java语言提供了对象终止(finalization)机制来允许开发人员自定义对象被销毁之前的处理逻辑。当垃圾回收器发现没有引用指向一个对象时,通常接下来要做的就是垃圾回收,即清除该对象,而finalization机制使得在清除此对象之前,总会先调用这个对象的finalize()方法。finalize()方法允许在子类中被重写,用于在对象被回收时进行资源释放或清理相关内存,例如关闭文件、套接字和数据库连接等。但是,不要过分依赖对象的finalize()方法来释放资源,最好有其他的方法来释放资源,例如手动调用close()方法,理由如下。(1)在调用finalize()方法时可能会导致对象复活,即在finalize()方法中当前对象this又被赋值给了一个有效的变量引用。(2)一个糟糕的finalize()会严重影响GC的性能,而长时间的GC是会影响程序运行性能和体验的。(3)finalize()方法的执行时间是没有保障的,它完全由GC线程决定,极端情况下,若不发生GC,则finalize()方法将没有执行机会。另外,finalize()方法工作效率很低。如果一个对象在回收前需要调用finalize()方法的话,要先将其加入一个队列,之后由Finalizer线程处理这些对象,而这个线程的优先级非常低,所以很难被CPU执行到,进而导致对象的finalize()方法迟迟不能被执行,资源迟迟不能被释放,对象迟迟不能被垃圾回收。从功能上来说,finalize()方法与C++中的析构函数比较相似,都是用来做清理善后的工作。只不过C++中需要手动调用析构函数清理内存,而Java采用的是基于垃圾回收器的自动内存管理机制。finalize()方法在本质上不同于C++中的析构函数。由于finalize()方法的存在,JVM中的对象一般处于三种可能的状态。如果从所有的根节点都无法访问到某个对象,说明该对象已经不再使用了。一般来说,此对象需要被回收。但事实上,也并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段。一个无法触及的对象有可能在某一个条件下“复活”自己,如果这样,那么对它的回收就是不合理的,为此,定义JVM中的对象可能的三种状态。

(1)可触及的:从根节点开始,可以到达这个对象
(2)可复活的:对象的所有引用都被释放,但是对象有可能在finalize()中复活。(3)不可触及的:对象的finalize()被调用,并且没有复活,那么就会进入不可触及状态。不可触及的对象不可能被复活,因为每一个对象的finalize()只会被调用一次。以上三种状态中只有在对象不可触及时才可以被回收。判定一个对象objA是否可回收,至少要经历以下两次标记过程。(1)如果GC Roots到对象objA没有引用链,则进行第一次标记。(2)判断此对象是否有必要执行finalize()方法。如果对象objA没有重写finalize()方法,或者finalize()方法已经被JVM调用过,则JVM视为“没有必要执行”​,objA被判定为不可触及。如果对象objA重写了finalize()方法,且还未执行过,那么objA会被插入到F-Queue队列中,由一个JVM自动创建的、低优先级的Finalizer线程触发其finalize()方法执行。finalize()方法是对象逃脱死亡的最后机会,稍后GC会对F-Queue队列中的对象进行第二次标记。如果objA在finalize()方法中与引用链上的任何一个对象建立了联系,那么在第二次标记时,objA会被移出“即将回收”集合。之后,对象如果再次出现没有引用存在的情况,finaliz()方法就不会被再次调用,对象会直接变成不可触及的状态,也就是说,一个对象的finalize()方法只会被调用一次。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RJ45 连接器(水晶头)的引脚定义

RJ45连接器核心定义 【】物理结构 8个金属触点(Pin 1至Pin 8)的透明塑料插头,带塑料卡榫。 引脚编号规则 卡榫朝下,金属触点面向自己时: 最左侧为 Pin 1 最右侧为 Pin 8 顺序:Pin 1 → Pin 2 → Pin 3 → P…

小架构step系列08:logback.xml的配置

1 概述 logback.xml配置文件的详细配置,很多地方都说得比较细,本文主要从几个重点来看一下原理,了解原理能够帮助确定哪些应该配置,以及如何配置。 logback.xml是为打印日志服务的,打印的内容一般打印到控制台(Conso…

STM32中SPI协议详解

前言 在嵌入式系统中,设备间的数据传输协议多种多样,SPI(Serial Peripheral Interface,串行外设接口)凭借其高速、全双工、易用性等特点,成为连接STM32与高速外设(如OLED屏、Flash芯片、AD转换器…

TypeScript 接口全解析:从基础到高级应用

TypeScript 接口全解析:从基础到高级应用在 TypeScript 中,接口是定义数据结构和行为规范的强大工具,它能够显著提升代码的可读性、可维护性和类型安全性。本文将全面讲解 TypeScript 接口的相关知识点,从基础语法到高级特性&…

主存(DRAM)是什么?

主存(DRAM)是什么? 主存(DRAM)详解 主存(Main Memory) 通常由 DRAM(Dynamic Random Access Memory,动态随机存取存储器) 构成,是计算机系统中用于…

Python 机器学习核心入门与实战进阶 Day 6 - 模型保存与加载(joblib / pickle)

✅ 今日目标 掌握如何将训练好的模型持久化保存到文件熟悉两种主流保存方式:joblib 和 pickle加载模型并应用于新数据预测实现完整的“训练 → 保存 → 加载 → 预测”流程为后续部署做准备(如 Flask、FastAPI)🧰 一、模型保存工具…

【SigNoz部署安装】Ubuntu环境部署SigNoz:Docker容器化监控的全流程指南

文章目录前言1.关于SigNoz2.本地部署SigNoz3.SigNoz简单使用4. 安装内网穿透5.配置SigNoz公网地址6. 配置固定公网地址前言 在分布式架构主导的现代运维体系中,系统性能监控正面临范式变革的关键转折。当微服务架构遭遇服务雪崩、无服务器架构出现冷启动延迟等复杂…

NV298NV312美光固态闪存NW639NW640

美光固态闪存技术全景解析:从NV298到NW640的深度探索近年来,美光科技凭借其在3D NAND闪存技术上的持续突破,推出了多款备受市场关注的固态硬盘产品。本文将从技术评测、产品对比、市场趋势、用户反馈及应用场景等多个维度,深入剖析…

2025.07.04【服务器】|使用万兆网卡提升服务器间互联速度,实现快速数据传输

文章目录1. **万兆网卡概述**2. **为什么选择万兆网卡**3. **万兆网卡配置与安装**3.1 **安装网卡**3.2 **安装驱动程序**3.3 **检查网卡状态**4. **配置网络接口**4.1 **Linux 系统配置**4.2 **Windows 系统配置**5. **优化性能**5.1 **使用多线程传输**5.2 **开启 TCP/UDP 窗…

光伏发电量精准估算,提升投资效益

在光伏产业规模化发展进程中,准确估算光伏发电量是提升项目投资效益的关键环节。科学的发电量预测不仅能为项目可行性研究提供依据,更能在电站全生命周期内优化运营策略,实现投资回报最大化。基于多维度数据整合与智能算法构建的精准预测体系…

Linux的互斥锁、Linux的POSIX信号量(二值、计数)、RTOS的二值信号量

锁和信号量最大的区别就是:锁严格要求 “谁占用谁释放”,而信号量允许 “一个任务 / 线程释放,另一个任务 / 线程获取”。 特性互斥锁(Mutex)POSIX 信号量(Semaphore)初始状态初始为 “锁定”(PTHREAD_MUTEX_INITIALIZER),需显式获取(pthread_mutex_lock)。初始值可…

基于Java+SpringBoot 协同过滤算法私人诊所管理系统

源码编号:S607源码名称:基于SpringBoot5的协同过滤算法的私人诊所管理系统用户类型:双角色,患者、医生、管理员数据库表数量:15 张表主要技术:Java、Vue、ElementUl 、SpringBoot、Maven运行环境&#xff1…

什么是DINO?

DINO 是一个由 Meta AI (当时的 Facebook AI) 在 2021 年提出的自监督学习框架,其全称是 “self-DIstillation with NO labels”,直译为“无标签的自我蒸馏”。这个名字精准地概括了它的核心思想。 DINO 的出现是一个里程碑,因为它首次有力地…

如何在 Android Framework层面控制高通(Qualcomm)芯片的 CPU 和 GPU。

如何在 Android Framework层面控制高通(Qualcomm)芯片的 CPU 和 GPU。 参考:https://blog.csdn.net/YoungHong1992/article/details/117047839?utm_source%20%20uc_fansmsg 作为一名 Framework 开发者,您拥有系统级的权限&#…

程序员在线接单

十年Java全栈工程师在线接单Java程序代做,兼职接单,系统代做,二次开发,网站开发部署,项目合作,商业项目承包 全栈开发,支持定制各种管理系统、小程序 商用或个人使用等项目都接 服务二: Java调试…

Python 异步爬虫(aiohttp)高效抓取新闻数据

一、异步爬虫的优势 在传统的同步爬虫中,爬虫在发送请求后会阻塞等待服务器响应,直到收到响应后才会继续执行后续操作。这种模式在面对大量请求时,会导致大量的时间浪费在等待响应上,爬取效率较低。而异步爬虫则等待可以在服务器…

Jenkins Pipeline(二)

1.Pipeline 变量 在 Jenkins 管道(Pipeline)中,变量是一种非常有用的功能,它们可以帮助你在构建过程中存储和传递数据。Jenkins 管道支持多种方式来定义和使用变量,包括环境变量、脚本变量以及全局变量。 1.2 脚本变…

springsecurity02

提前打开Redis1)通过内置的用户名和密码登录spring-boot-starter-security.jar2)使用自定义用户名和密码登录UserDetailService自定义类实现UserDetailService接口,重写loadUserByUsername方法class UserDetailServiceImpl implements UserDe…

Apache组件遭大规模攻击:Tomcat与Camel高危RCE漏洞引发数千次利用尝试

漏洞态势分析帕洛阿尔托网络公司Unit 42团队最新研究报告显示,针对Apache Tomcat和Apache Camel关键漏洞的网络攻击正在全球激增。2025年3月披露的这三个远程代码执行(RCE, Remote Code Execution)漏洞——CVE-2025-24813(Tomcat&…

Odoo 中国特色高级工作流审批模块研发

本文旨在为基于Odoo 18平台开发一款符合中国用户习惯的、功能强大的通用工作流审批模块提供一份全面的技术实现与产品设计方案。该模块的核心特性包括:为最终用户设计的图形化流程设计器、对任意Odoo模型的普适性、复杂的审批节点逻辑(如会签、条件分支、…