当前位置: 首页 > news >正文

【JVM】finalize() 方法的定义与作用

finalize() 方法的定义与作用

定义

finalize() 方法是 Java 中的一种特殊方法,定义在 java.lang.Object 类中。它在对象被垃圾回收之前由垃圾回收器调用,用于执行清理操作。

方法签名:

protected void finalize() throws Throwable
作用
  • 资源释放:用于释放非内存资源,例如文件句柄、网络连接、数据库连接等。
  • 对象清理:执行对象在被回收前需要的清理操作。
使用 finalize() 方法需要注意的事项
  • 不确定性finalize() 方法的调用时间是不确定的,可能会延迟或甚至不被调用,因此不应依赖 finalize() 来执行重要的清理工作。
  • 性能问题:过多的 finalize() 方法会增加垃圾回收器的负担,降低性能。
  • 替代方案:Java 7 引入了 try-with-resourcesAutoCloseable 接口,推荐使用这些机制来替代 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();}}
}

解释示例中的关键部分

  1. 构造方法Resource 类的构造方法用于创建对象,并输出创建的信息。
  2. finalize() 方法:重写 finalize() 方法,在对象被回收前输出信息并执行清理操作。
  3. main 方法
    • 创建两个 Resource 对象 res1res2
    • 将对象引用置为 null,使它们变为不可达状态。
    • 调用 System.gc() 强制触发垃圾回收。
    • 使用 Thread.sleep(1000) 给垃圾回收器一些时间来执行 finalize() 方法。

finalize() 方法的局限性与替代方案

局限性
  • 不确定性:无法保证 finalize() 方法何时被调用。
  • 性能开销:对象进入 finalize() 队列需要更多的处理时间。
  • 复杂性:编写可靠的 finalize() 方法可能会增加代码复杂性。
替代方案
  1. try-with-resourcesAutoCloseable 接口

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)&#xff0c…...

【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是两种不同的概念&#xff0c;它们在索引管理中扮演不同的角色&#xff1a; ### Index Template&#xff08;索引模板&#xff09; 1. **目的**&#xff1a;用于定义新索引的默认设置&#xff0c;包括映射、设置、别名等。 …...

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开发中&#xff0c;Cookies是一种在客户端&#xff08;通常是浏览器&#xff09;存储少量数据的机制。PHP作为一种服务器端脚本语言&#xff0c;提供了对Cookies的全面支持&#xff0c;使得开发者可以轻松地设置、读取和删除Cookies。Cookies通常用于存储用户的会话信息&a…...

【GD32F303红枫派使用手册】第十四节 DAC-输出电压实验

14.1 实验内容 通过本实验主要学习以下内容&#xff1a; DAC工作原理 使用DAC输出电压 14.2 实验原理 14.2.1 DAC工作原理 我们上几章学习了ADC&#xff0c;本章我们来学习DAC。ADC是模-数转换&#xff0c;即模拟量转换为数字量&#xff0c;DAC正好相反&#xff0c;即数-…...

java 使用Log4j进行日志记录

要在Java项目中使用Log4j进行日志记录&#xff0c;需要经过以下步骤&#xff1a; 添加Log4j依赖&#xff1a;在项目的pom.xml文件中&#xff0c;添加Log4j依赖。例如&#xff1a; <dependency><groupId>log4j</groupId><artifactId>log4j</artifa…...

【问题解决】adb remount 失败或刷机无法连接设备(KaiOS)

问题描述 1、设备无法adb remount成功&#xff0c; 2、通过fastboot无法识别设备&#xff0c;一直卡住 3、已经识别到9008端口&#xff0c;但是设备与刷机工具connect fail&#xff0c;甚至软件crash 解决方案 1、安装高通驱动工具&#xff1a;QDLoder HS-USB Driver QDLoade…...

为什么电容两端电压不能突变

我们先从RC延时电路说起吧&#xff0c;图1是最简单的RC延时电路&#xff0c;给一个阶跃的电压信号&#xff0c;电压会变成黄色曲线这个样子&#xff0c;这是为什么呢&#xff1f; 图1 电压跳变后&#xff0c;电源负极电子移动到电容下极板&#xff0c;排斥上极板电子流动到电源…...

Redux 与 MVI:Android 应用的对比

Redux 与 MVI&#xff1a;Android 应用的对比 在为 Android 应用选择合适的状态管理架构时可能会感到困惑。在这个领域中&#xff0c;有两种流行的选择是 Redux 和 MVI&#xff08;Model-View-Intent&#xff09;。两者都有各自的优缺点&#xff0c;因此在深入研究之前了解它们…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...