【JVM】finalize() 方法的定义与作用
finalize() 方法的定义与作用
定义
finalize() 方法是 Java 中的一种特殊方法,定义在 java.lang.Object 类中。它在对象被垃圾回收之前由垃圾回收器调用,用于执行清理操作。
方法签名:
protected void finalize() throws Throwable
作用
- 资源释放:用于释放非内存资源,例如文件句柄、网络连接、数据库连接等。
- 对象清理:执行对象在被回收前需要的清理操作。
使用 finalize() 方法需要注意的事项
- 不确定性:
finalize()方法的调用时间是不确定的,可能会延迟或甚至不被调用,因此不应依赖finalize()来执行重要的清理工作。 - 性能问题:过多的
finalize()方法会增加垃圾回收器的负担,降低性能。 - 替代方案:Java 7 引入了
try-with-resources和AutoCloseable接口,推荐使用这些机制来替代finalize()。
finalize() 方法的示例
以下示例展示了如何使用 finalize() 方法来执行对象被回收前的清理工作。
public class Resource {private String name;public Resource(String name) {this.name = name;System.out.println(name + " created.");}@Overrideprotected void finalize() throws Throwable {try {System.out.println(name + " is being finalized.");// 释放资源的代码} finally {super.finalize();}}public static void main(String[] args) {Resource res1 = new Resource("Resource1");Resource res2 = new Resource("Resource2");// 将对象置为 null,方便 GC 进行回收res1 = null;res2 = null;// 强制垃圾回收System.gc();// 给垃圾回收器一些时间来执行try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}
}
解释示例中的关键部分
- 构造方法:
Resource类的构造方法用于创建对象,并输出创建的信息。 finalize()方法:重写finalize()方法,在对象被回收前输出信息并执行清理操作。main方法:- 创建两个
Resource对象res1和res2。 - 将对象引用置为
null,使它们变为不可达状态。 - 调用
System.gc()强制触发垃圾回收。 - 使用
Thread.sleep(1000)给垃圾回收器一些时间来执行finalize()方法。
- 创建两个
finalize() 方法的局限性与替代方案
局限性
- 不确定性:无法保证
finalize()方法何时被调用。 - 性能开销:对象进入
finalize()队列需要更多的处理时间。 - 复杂性:编写可靠的
finalize()方法可能会增加代码复杂性。
替代方案
try-with-resources和AutoCloseable接口
Java 7 引入的 try-with-resources 语句和 AutoCloseable 接口是管理资源的更好方法。AutoCloseable 接口提供了 close() 方法,可以在 try-with-resources 语句结束时自动调用。
示例:
public class Resource implements AutoCloseable {private String name;public Resource(String name) {this.name = name;System.out.println(name + " created.");}@Overridepublic void close() {System.out.println(name + " is being closed.");// 释放资源的代码}public static void main(String[] args) {try (Resource res = new Resource("Resource1")) {// 使用资源}// 自动调用 res.close() 方法}
}
在这个示例中,Resource 类实现了 AutoCloseable 接口,并在 close() 方法中执行资源释放操作。使用 try-with-resources 语句,可以确保资源在使用完后自动关闭。
总结
尽管 finalize() 方法可以用于对象被垃圾回收前的清理操作,但由于其不确定性和性能问题,推荐使用 try-with-resources 语句和 AutoCloseable 接口来替代 finalize() 方法,确保资源的及时释放和更好的代码管理。
相关文章:
【JVM】finalize() 方法的定义与作用
finalize() 方法的定义与作用 定义 finalize() 方法是 Java 中的一种特殊方法,定义在 java.lang.Object 类中。它在对象被垃圾回收之前由垃圾回收器调用,用于执行清理操作。 方法签名: protected void finalize() throws Throwable作用 …...
这10个前端库,帮我在工作中赢得了不少摸鱼时间!!
文章目录 前言1、dayjs2、 lodash3、 Quill4、 crypto-js5、 viewerjs6、 localforage7、 vconsole8、 uuid9、 copy-text-to-clipboard10、 classnames前言 通过高效的工具提高工作效率,从而有更多的时间来处理其他重要的任务,或者……摸鱼。没错!就是摸鱼。毕竟,提高效率…...
(2024最新)CentOS 7上在线安装MySQL 5.7
在CentOS 7上安装MySQL 5.7并配置允许远程连接,以下是详细步骤: 1. 添加MySQL官方存储库 首先,下载并添加MySQL的官方存储库。默认情况下,添加的存储库可能会包含最新的MySQL版本(如MySQL 8.0),…...
【C++高阶】C++继承学习手册:全面解析继承的各个方面
📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C “ 登神长阶 ” 🤡往期回顾🤡:模板进阶 🌹🌹期待您的关注 🌹🌹 继承 📖1. 继承的概念及定义…...
使用GPT-soVITS再4060下2小时训练声音模型以及处理断句带来的声音模糊问题
B站UP主视频 感谢UP主“白菜工厂1145号员工”的“熟肉”,我这篇笔记就不展示整一个训练和推理流程,重点写的4060该注意的一些事项。如何解决断句模糊的问题,在本篇笔记的最末尾。 相关连接: 原项目github UP主的说明文档 1、训…...
如何对stm32查看IO功能。
有些同学对于别人的开发板的资源,或者IO口,或者串口等资源不知道怎么分配。 方法1、看硬石、野火、正点原子的开发板,看下他们的例子,那个资源用什么。自己多看几个原理图,多看几个视频,做一下笔记。以后依…...
docker构建jdk17镜像
资料参考 参考自黑马教程:10.Docker基础-自定义镜像_哔哩哔哩_bilibili 更多详细语法声明,请参考官网文档:https://docs.docker.com/engine/reference/builder 初步准备 1、下载jdk17包(linux版),我这边版…...
Android Uri转File path路径,Kotlin
Android Uri转File path路径,Kotlin /*** URI转化为file path路径*/private fun getFilePathFromURI(context: Context, contentURI: Uri): String? {val result: String?var cursor: Cursor? nulltry {cursor context.contentResolver.query(contentURI, null…...
iOS界面设计要点:四大模块解析
UI设计不是艺术设计,这限制了我们从设备和现有技术开始设计。因此,熟悉每个平台的设计规则已经成为每个设计师的第一课,也是每个设计师必要的专业知识。 今天小边给您带来了iOS设计规范,希望帮助您快速熟悉iOS平台设计规范&#…...
数字取证技术(Digital Forensics Technology)实验课II
数字取证技术(Digital Forensics Technology)实验课II 本文是我本学期的教学课题目,不包含任何博客知识分享,无关的读者可忽略; 实验练习题 (♞思考):请对工作邮件进行签名;“problem3_1.txt"里存储的是由John Doe撰写的真实的邮件,而"problem3_2.txt"里存储的…...
Redis缓存的使用
1.缓存穿透 描述:查询数据在redis不存在,请求打到数据库 解决方法: 缓存空值 当出现Redis查不到数据,数据库也查不到数据的情况,我们就把这个key保存到Redis中,设置value"null",并设…...
力扣LCP 08.剧情触发时间
力扣LCP 08.剧情触发时间 前缀和 二分 对increase求前缀和 在前缀和数组上做二分 找到符合要求的最小时间 class Solution {public:vector<int> getTriggerTime(vector<vector<int>>& increase, vector<vector<int>>& requirements)…...
Elasticsearch-IndexTemplate和DynamicTemplate 有什么区别
Elasticsearch中的Index Template和Dynamic Template是两种不同的概念,它们在索引管理中扮演不同的角色: ### Index Template(索引模板) 1. **目的**:用于定义新索引的默认设置,包括映射、设置、别名等。 …...
list集合自定义排序
一、基本类型排序 1.list中只有数字或字符串 //升序排序 List<T> ,T为数字或字符串 Collections.sort(list); //降序排序 Collections.sort(list,Collections.reverseOrder());2.list中为对象 基于jdk.18 import lombok.Data;Data public class User {private int i…...
PHP Cookies:应用与管理
在Web开发中,Cookies是一种在客户端(通常是浏览器)存储少量数据的机制。PHP作为一种服务器端脚本语言,提供了对Cookies的全面支持,使得开发者可以轻松地设置、读取和删除Cookies。Cookies通常用于存储用户的会话信息&a…...
【GD32F303红枫派使用手册】第十四节 DAC-输出电压实验
14.1 实验内容 通过本实验主要学习以下内容: DAC工作原理 使用DAC输出电压 14.2 实验原理 14.2.1 DAC工作原理 我们上几章学习了ADC,本章我们来学习DAC。ADC是模-数转换,即模拟量转换为数字量,DAC正好相反,即数-…...
java 使用Log4j进行日志记录
要在Java项目中使用Log4j进行日志记录,需要经过以下步骤: 添加Log4j依赖:在项目的pom.xml文件中,添加Log4j依赖。例如: <dependency><groupId>log4j</groupId><artifactId>log4j</artifa…...
【问题解决】adb remount 失败或刷机无法连接设备(KaiOS)
问题描述 1、设备无法adb remount成功, 2、通过fastboot无法识别设备,一直卡住 3、已经识别到9008端口,但是设备与刷机工具connect fail,甚至软件crash 解决方案 1、安装高通驱动工具:QDLoder HS-USB Driver QDLoade…...
为什么电容两端电压不能突变
我们先从RC延时电路说起吧,图1是最简单的RC延时电路,给一个阶跃的电压信号,电压会变成黄色曲线这个样子,这是为什么呢? 图1 电压跳变后,电源负极电子移动到电容下极板,排斥上极板电子流动到电源…...
Redux 与 MVI:Android 应用的对比
Redux 与 MVI:Android 应用的对比 在为 Android 应用选择合适的状态管理架构时可能会感到困惑。在这个领域中,有两种流行的选择是 Redux 和 MVI(Model-View-Intent)。两者都有各自的优缺点,因此在深入研究之前了解它们…...
5分钟掌握Mermaid Live Editor:免费在线图表编辑终极指南
5分钟掌握Mermaid Live Editor:免费在线图表编辑终极指南 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-edi…...
炉石传说HsMod插件终极指南:55项功能完整配置与使用教程
炉石传说HsMod插件终极指南:55项功能完整配置与使用教程 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod HsMod是基于BepInEx框架开发的炉石传说多功能增强插件,为玩…...
Jasminum:为中文研究者量身打造的Zotero智能文献管理解决方案
Jasminum:为中文研究者量身打造的Zotero智能文献管理解决方案 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 在中文学…...
项目介绍 MATLAB实现基于长短期记忆网络(LSTM)进行多工况多个时间步车速预测(含模型描述及部分示例代码)专栏近期有大量优惠 还请多多点一下关注 加油 谢谢 你的鼓励是我前行的动力 谢谢支持 加
MATLAB实现基于长短期记忆网络(LSTM)进行多工况多个时间步车速预测的详细项目实例 请注意此篇内容只是一个项目介绍 更多详细内容可直接联系博主本人 或者访问对应标题的完整博客或者文档下载页面(含完整的程序,GUI设计和代码详…...
全面战争模组开发者的终极工具箱:RPFM如何重新定义游戏数据管理
全面战争模组开发者的终极工具箱:RPFM如何重新定义游戏数据管理 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: ht…...
自制编程语言:挑战与乐趣并存,10000 行 C++ 代码实现多项功能,未来规划丰富!
自制编程语言:比想象中容易,也更具挑战2026 年 5 月 6 日。去年 12 月中旬,作者开始打造自己的编程语言,目前距生产级质量有差距,但已编写约 1000 行代码的蒙特卡罗路径追踪器。项目暂停,作者分享相关内容。…...
使用curl命令直接测试Taotoken大模型API接口
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用curl命令直接测试Taotoken大模型API接口 对于需要在无SDK环境或进行快速接口测试的开发者而言,直接使用curl命令调…...
如何用Video2X实现免费AI视频画质提升:新手终极指南
如何用Video2X实现免费AI视频画质提升:新手终极指南 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/video2x…...
AssetStudio:解锁Unity游戏资源宝库的专业工具
AssetStudio:解锁Unity游戏资源宝库的专业工具 【免费下载链接】AssetStudio AssetStudio - Based on the archived Perfares AssetStudio, I continue Perfares work to keep AssetStudio up-to-date, with support for new Unity versions and additional improve…...
从流场GIF到模态分解:用MATLAB DMD一键提取涡旋的频率与增长率
从流场动画到科学洞察:MATLAB DMD技术解析涡旋动力学 当一段流体运动的GIF动画在你面前循环播放时,那些旋转的涡旋和波动的剪切层不仅仅是视觉奇观——它们隐藏着支配流动演化的数学密码。作为流体研究者,我们常常陷入这样的困境:…...
