Java 资源管理教程:掌握 close 方法、Cleaner 类与 Runtime.addShutdownHook

在 Java 编程中,高效地管理资源是至关重要的,特别是当你处理文件、数据库连接、网络连接等有限资源时。为了确保这些资源得到正确释放,Java 提供了多种机制。本教程将深入探讨 close 方法、Cleaner类以及 Runtime.addShutdownHook 方法,帮助你更好地管理资源。
在这里插入图片描述

1. close 方法:资源释放的基础

close 方法是 Java 中释放资源的标准方式。它通常与实现了 java.io.Closeable 接口(或其超接口 java.lang.AutoCloseable)的类一起使用。这些接口要求实现一个无参数的 close 方法,该方法负责释放资源。

为何使用 close 方法?

Java 中的许多资源是有限的,如文件句柄、数据库连接池等。如果不及时释放这些资源,可能会导致资源耗尽、性能下降甚至程序崩溃。close 方法提供了一种标准化的方式来释放这些资源。

如何使用 close 方法?

传统上,开发者需要在确定资源不再需要时手动调用 close 方法。然而,从 Java 7 开始,引入了 try-with-resources 语句,它简化了资源管理。这个语句确保在语句块结束时,每个资源都会自动调用其 close 方法,即使发生异常也是如此。

示例

try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {// 使用 BufferedReader 读取文件内容
} catch (IOException e) {// 处理 IO 异常
}
// BufferedReader 的 close 方法在这里已被自动调用

示例结构

+----------------+    +----------------+    +----------------+
| 创建资源对象   | -> | 在 try 块中使用  | -> | 自动/手动 close |
+----------------+    +----------------+    +----------------+|+----------------+| 捕获并处理异常 |+----------------+

(对于 try-with-resources,箭头从“在 try 块中使用”直接指向“自动 close”,并标注为“try-with-resources 语句”)

2. Cleaner 类:内部资源清理的助手

Cleaner 是 Java 内部使用的一个工具类,它提供了一种机制来自动清理与 Java 对象关联的本机(native)资源。这种机制通常被称为“清理器(Cleaner)机制”。

工作原理

  • Cleaner 对象与一个 PhantomReference 关联,这个 PhantomReference 指向需要清理的对象。
  • 当垃圾回收器(GC)发现只有 PhantomReference 指向某个对象时,它会将这个 PhantomReference 添加到与之关联的 ReferenceQueue 中。
  • Cleaner 线程(一个守护线程)会定期检查这个 ReferenceQueue,从中取出 PhantomReference,并执行与该 PhantomReference 关联的清理操作。
    示例结构
+----------------+    +----------------+    +----------------+    +----------------+
| Java 对象      | -> | PhantomReference | -> | ReferenceQueue | <- | Cleaner 线程   |
+----------------+    +----------------+    +----------------+    +----------------+|+----------------+| 垃圾回收发生   |+----------------+

(箭头表示对象之间的关联和流程方向)
注意事项

  • Cleaner 机制主要用于清理与 Java 对象关联的本机资源,如直接内存。
  • 普通开发者通常不需要直接使用 Cleaner 类,因为它是 Java 内部使用的。
  • Cleaner 机制不能保证在所有情况下都能及时清理资源,特别是在 JVM 崩溃或异常终止时。
3. Runtime.addShutdownHook:JVM 关闭时的清理

Runtime.addShutdownHook(Thread hook) 方法允许开发者注册一个关机钩子(shutdown hook),这个钩子是一个线程,它在 Java 虚拟机(JVM)正常终止时执行。

为何使用关机钩子?

关机钩子可用于执行一些在 JVM 关闭时需要完成的清理操作,如关闭数据库连接、停止线程池、保存应用程序状态等。这些操作通常不能通过 close 方法或 Cleaner 机制来实现,因为它们需要在 JVM 关闭时执行。

如何使用关机钩子?

你可以通过调用 Runtime.getRuntime().addShutdownHook(Thread hook) 方法来注册一个关机钩子。当 JVM 正常终止时,这个钩子线程会被执行。需要注意的是,如果 JVM 因某些紧急情况(如崩溃)而终止,那么注册的关机钩子可能不会被执行。

示例

Runtime.getRuntime().addShutdownHook(new Thread(() -> {// 在此处添加在 JVM 关闭时需要执行的清理代码System.out.println("JVM is shutting down...");// 关闭数据库连接、停止线程池等清理操作
}));

示例结构

+----------------+    +----------------+    +----------------+
| JVM 运行中     | -> | 注册关机钩子   | -> | JVM 关闭时执行 |
+----------------+    +----------------+    +----------------+|+----------------+| 关机钩子线程   |+----------------+

(箭头表示 JVM 状态的变化和关机钩子的注册与执行)
注意事项

  • 关机钩子线程的执行顺序是不确定的。
  • 如果在关机钩子中抛出了未捕获的异常,JVM 可能会终止,而不会执行后续的关机钩子。

通过掌握这些机制,你可以更有效地管理 Java 应用程序中的资源,确保它们在不再需要时被正确释放,从而避免资源泄露和性能问题。

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

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

相关文章

ASP.NET Blazor部署方式有哪些?

今天我们来说说Blazor的三种部署方式&#xff0c;如果大家还不了解Blazor&#xff0c;那么我先简单介绍下Blazor Blazor 是一种 .NET 前端 Web 框架&#xff0c;在单个编程模型中同时支持服务器端呈现和客户端交互性&#xff1a; ● 使用 C# 创建丰富的交互式 UI。 ● 共享使用…

微信小程序使用上拉加载onReachBottom。页面拖不动。一直无法触发上拉的事件。

1&#xff0c;可能是原因是你使用了scroll-view的标签&#xff0c;用onReachBottom触发加载事件。这两个是有冲突的。没办法一起使用。如果页面的样式是滚动的是无法去触发页面的onReachBottom的函数的。因此&#xff0c;你使用overflow:auto.来使用页面的某些元素滚动&#xf…

学习ASP.NET Core的身份认证(基于JwtBearer的身份认证9)

测试数据库中只有之前记录温湿度及烟雾值的表中数据较多&#xff0c;在该数据库中增加AppUser表&#xff0c;用于登录用户身份查询&#xff0c;数据库表如下所示&#xff1a;   项目中安装SqlSugarCore包&#xff0c;然后修改控制器类的登录函数及分页查询数据函数&#xff…

【人工智能】:搭建本地AI服务——Ollama、LobeChat和Go语言的全方位实践指南

前言 随着自然语言处理&#xff08;NLP&#xff09;技术的快速发展&#xff0c;越来越多的企业和个人开发者寻求在本地环境中运行大型语言模型&#xff08;LLM&#xff09;&#xff0c;以确保数据隐私和提高响应速度。Ollama 作为一个强大的本地运行框架&#xff0c;支持多种先…

Flutter:carousel_slider 横向轮播图、垂直轮播公告栏实现

安装依赖 carousel_slider: ^5.0.01、垂直滚动公告栏 import package:carousel_slider/carousel_options.dart;// 垂直滚动公告栏Widget _buildNotice() {return <Widget>[<Widget>[TDImage(assetUrl: "assets/img/home11.png",width: 60.w,height: 60.w…

图像去雾数据集的下载和预处理操作

前言 目前&#xff0c;因为要做对比实验&#xff0c;收集了一下去雾数据集&#xff0c;并且建立了一个数据集的预处理工程。 这是以前我写的一个小仓库&#xff0c;我决定还是把它用起来&#xff0c;下面将展示下载的路径和数据处理的方法。 下面的代码均可以在此找到。Auo…

C++ 面向对象(继承)

三、继承 3.1 继承的概念 基于一个已有的类 去重新定义一个新的类&#xff0c;这种方式我们叫做继承 关于继承的称呼 一个类B 继承来自 类 A 我们一般称呼 A类&#xff1a;父类 基类 B类: 子类 派生类 B继承自A A 派生了B 示例图的语法 class vehicle // 车类 {}class …

若依报错:无法访问com.ruoyi.common.annotation

无法访问com.ruoyi.common.annotation 若依的父工程的pom文件中设置了jdk为1.8&#xff0c;将idea的jdk也改为1.8即可。

< OS 有关 > 阿里云:轻量应用服务器 的使用 安装 Tailscale 后DNS 出错, 修复并替换 apt 数据源

VPS 配置 主机&#xff1a;vCPU x2, 512MB, 20GB位置&#xff1a;阿里云&#xff0c;日本.东京OS&#xff1a; ubuntu24.20 原因&#xff1a; 这篇是操作过程的记录文章。 2 个月前&#xff0c; 在阿里云买了台 vps 。当时本想放到韩国&#xff0c;因为它离北京近。 但最便…

小企业品牌塑造之困-中小企实战运营和营销工作室博客

小企业品牌塑造之困-中小企实战运营和营销工作室博客 在商业的广袤天地中&#xff0c;小企业如点点繁星&#xff0c;怀揣着成长为璀璨星辰的梦想。品牌塑造&#xff0c;无疑是它们迈向成功的关键路径。然而&#xff0c;现实却布满荆棘&#xff0c;众多小企业在品牌塑造的征程中…

HTML5 Canvas和JavaScript的3D粒子星系效果

HTML部分 基本结构包括<html>, <head>, 和 <body>标签。<title>标签设置了页面标题为“优化版3D粒子星系”。<style>块定义了一些基本样式&#xff1a; body&#xff1a;无边距&#xff0c;隐藏滚动条&#xff0c;黑色背景&#xff0c;禁用触摸…

65,【5】buuctf web [SUCTF 2019]Upload Labs 2

进入靶场 1,源代码 点击题目时有个就有个admin.php <?php // 引入配置文件 include config.php;class Ad{public $cmd;public $clazz;public $func1;public $func2;public $func3;public $instance;public $arg1;public $arg2;public $arg3;// 构造函数&#xff0c;用于初…

BLE透传方案,IoT短距无线通信的“中坚力量”

在物联网&#xff08;IoT&#xff09;短距无线通信生态系统中&#xff0c;低功耗蓝牙&#xff08;BLE&#xff09;数据透传是一种无需任何网络或基础设施即可完成双向通信的技术。其主要通过简单操作串口的方式进行无线数据传输&#xff0c;最高能满足2Mbps的数据传输速率&…

12_PlayerPrefs存储登录窗口逻辑_回调函数优化Lamd表达式

创建 登录窗口LoginWnd.cs 绑定 登录窗口LoginWnd.cs 编写 登录窗口LoginWnd.cs using UnityEngine; using UnityEngine.UI; //输入文本 命名空间 //功能 : 登录注册窗口 public class LoginWnd : MonoBehaviour{public InputField iptAcct;public InputField iptPass;public …

西门子【Library of General Functions (LGF) for SIMATIC S7-1200 / S7-1500】

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 通用函数库 (LGF) 扩展了 TIA Portal 中用于 PLC 编程的 STEP 7 指令&#xff08;数学函数、时间、计数器 等&#xff09;。该库可以不受限制地使用&#xff0c;并包含 FIFO 、搜索功能、矩阵计算、 astro 计…

每日一刷——1.20——准备蓝桥杯

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目一 请统计某个给定范围[L, R]的所有整数中&#xff0c;数字2出现的次数。 比如给定范围[2, 22]&#xff0c;数字2在数2中出现了1次&#xff0c;在数12中出现1次&#xff0c;在数20中出现1次&a…

会议签到系统的架构和实现

会议签到系统的架构和实现 摘要:通过定制安卓会议机开机APP呈现签到界面&#xff0c;并且通过W/B结构采集管理签到信息&#xff0c;实现会议签到的功能。为达到此目标本文将探讨使用Redis提供后台数据支持&#xff1b;使用SocketIo处理适时消息&#xff1b;使用Flask进行原型开…

c++ 与 Matlab 程序的数据比对

文章目录 背景环境数据保存数据加载 背景 ***避免数据精度误差&#xff0c;快速对比变量 *** 环境 c下载 https://github.com/BlueBrain/HighFive 以及hdf5库 在vs 中配置库 数据保存 #include <highfive/highfive.hpp> using namespace HighFive;std::string fil…

OSS使用签名URL上传(返回前端上传地址)- NodeJS

使用过程 使用PUT方式的签名URL上传文件的过程如下&#xff1a; 代码示例 文件拥有者生成PUT方法的签名URL const OSS require("ali-oss");// 获取签名URL const client await new OSS({accessKeyId: yourAccessKeyId,accessKeySecret: yourAccessKeySecret,buc…

使用 div 自定义 input 和 textarea

1. 为什么要自定义呢&#xff1f; 原生的 input 和 textarea 在某些特定场景下存在功能或兼容性限制&#xff0c;因此使用 div 元素自定义实现&#xff0c;突破原生输入框在样式、功能、兼容性上的限制。 1、解决火狐浏览器换行问题 某些版本的火狐浏览器中&#xff0c;原生…