新闻中心
j*a中finalize的重写
finalize()自J*a 9起被弃用、J*a 18彻底移除,因其调用时机不确定、性能开销大、线程不安全、异常被吞且无法保证执行;应改用AutoCloseable+try-with-resources、Cleaner或显式释放。

J*a 中 finalize() 方法已被标记为 @Deprecated,自 J*a 9 起不推荐使用,J*a 18 开始彻底移除(JEP 421),因此不建议重写 finalize,也不应依赖它来释放资源。
为什么 finalize 不该被重写
该方法由垃圾回收器在对象真正回收前调用,但存在严重问题:
- 调用时机不确定:GC 可能永远不运行,或延迟极久,导致资源长期泄漏
- 性能开销大:启用 finalize 的对象需经历至少两次 GC 才能回收(称为“finalization queue”机制)
- 线程不安全:finalize 在专用 Finalizer 线程中执行,可能与主线程竞争资源
- 异常会被吞掉:finalize 中抛出的未捕获异常不会传播,仅被忽略,难以调试
- 无法保证执行:JVM 退出时,未执行的 finalize 可能直接跳过
替代 finalize 的正确做法
资源清理应主动、及时、可预测。推荐以下方式:
- 实现 AutoCloseable 接口 + try-with-resources:适用于文件、网络连接、数据库连接等需要显式关闭的资源
- 使用 Cleaner(J*a 9+):轻量、无性能惩罚的清理机制,基于虚引用(PhantomReference),比 finalize 更可靠
-
显式释放 + 文档约定:在类文档中明确说明需调用
close()或shutdown(),并提供默认空实现防止误用
示例(Cleaner):
网奇企业网站管理系统CWMS2.0 英文版
CWMS 2.0功能介绍:一、 员工考勤系统,国内首创CWMS2.0的企业员工在线考勤系统。二、 自定义URL Rewrite重写,友好的搜索引擎 URL优化。三、 代码与模板分离技术,支持超过5种类型的模板类型。包括:文章、图文、产品、单页、留言板。四、 购物车功能,CWMS2.0集成国内主流支付接口。如:淘宝、易趣、快钱等。完全可媲美专业网上商城系统。五、 多语言自动切换 中英文的说明。六、
0
查看详情
public class Resource {
private static final Cleaner cleaner = Cleaner.create();
private final Cleanable cleanable;
private final ByteBuffer buffer;
public Resource() {
this.buffer = ByteBuffer.allocateDirect(1024);
this.cleanable = cleaner.register(this, ne
w ResourceCleaner(buffer));
}
// 清理动作封装为 Runnable
private static class ResourceCleaner implements Runnable {
private final ByteBuffer buffer;
ResourceCleaner(ByteBuffer buffer) { this.buffer = buffer; }
public void run() { CleanerTest.freeDirectBuffer(buffer); }
}
// 显式清理(可选,用于提前释放)
public void close() { cleanable.clean(); }
}
如果旧代码里还有 finalize ……
请尽快迁移。若暂时无法删除,注意:
- 必须调用
super.finalize()(否则父类清理逻辑丢失) - 不要在 finalize 中重新使对象“复活”(如将 this 赋值给静态变量),这会导致内存泄漏且破坏 GC 正确性
- 避免任何耗时操作或同步块,否则会阻塞 Finalizer 线程,拖慢整个 JVM 的回收
基本上就这些。finalize 是个历史包袱,现代 J*a 开发中应当完全绕过它。
以上就是j*a中finalize的重写的详细内容,更多请关注其它相关文章!
# 时长
# 佛山百度seo实力乐云seo
# 高港外贸营销之线上推广
# seo501
# 品牌推广逆传播营销渠道
# 湛江360关键词排名
# 闽清企业seo推广
# 淡水seo推广价格
# 推广营销的发展阶段包括
# 新媒体交互设计网站推广
# seo优化有哪些特征
# 移除
# java
# 不安全
# 转换为
# 不确定
# 好了
# 企业网站
# 英文版
# 管理系统
# 重写
# 为什么
# 垃圾回收器
# finalize
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Discord Slash 命令响应超时问题的异步解决方案
将JSON对象数组转置为键值对列表的实用指南
mcjs网页版流畅运行 mcjs低配电脑畅玩入口
QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台
内存疯狂猛猛涨价:主板销量直接腰斩!
Linux如何构建多环境配置管理_Linux多环境配置方案
Safari怎么安装扩展程序 浏览器插件安装与管理方法【详解】
在J*a中如何隐藏复杂性_使用门面模式组织对象交互
HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全
为什么简单的XML文件也会解析失败? 检查隐藏的非打印字符(如BOM)的方法
如何使用Go和Martini动态服务解码后的图片
mysql备份恢复性能优化_mysql备份恢复性能优化方法
EMS快递官网app_中国邮政速递物流手机客户端
解决Django多数据库/多Schema环境下外键迁移问题
cad如何更改注释性对象的比例_cad注释性比例调整方法
铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则
sublime怎么格式化代码_sublime代码美化与一键排版插件配置
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
新三国志曹操传110级星符试炼夏侯渊极难攻略
Win11输入法不见了怎么办_Windows11恢复语言栏显示方法
高德地图公交到站提醒失败如何解决 高德提醒权限设置
GemBox Document HTML转PDF垂直文本渲染问题及解决方案
windows10怎么查看硬盘序列号_windows10硬盘id查询命令
响应式容器内容自动缩放与宽高比维持教程
深入理解Promise链:如何在catch后中断then的执行
Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践
Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧
UC浏览器如何安装插件 UC浏览器添加扩展程序详细教程【进阶】
双系统安装时,如何设置默认启动系统? msconfig命令了解一下!
Go语言中对Map值调用带指针接收者方法:原理与最佳实践
在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南
新手怎么开始学化妆 零基础化妆入门教程
12306几点到几点不能订票? | 官方最新系统维护时间全解析
探索高级语言到原生C/C++的转译:挑战与内存管理策略
小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】
Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖
AI泡沫首次被“刺破”:GPU十年都无法存活!
Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法
KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法
Go语言中Map存储的结构体如何调用指针方法:深入解析与实践
豆包手机助手发布技术预览版:直接嵌入手机系统!努比亚样机发售
汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口
解决 Express.js 中 PUT 请求密码修改失败的路由配置指南
vivo云服务网页版登录 怎么登录vivo云服务网页版
12306选座如何查看座位示意图_12306座位示意图解读与使用
CSS响应式网页如何实现主次模块比例自适应_flex-grow与flex-shrink调整
动漫花园资源网使用步骤_动漫花园资源网下载流程
谷歌推RCS信息存档功能:公司可监控员工私密信息!
CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠
神经网络二分类模型训练异常:高损失与完美验证准确率的排查与修正


2025-12-06
浏览次数:次
返回列表
w ResourceCleaner(buffer));
}
// 清理动作封装为 Runnable
private static class ResourceCleaner implements Runnable {
private final ByteBuffer buffer;
ResourceCleaner(ByteBuffer buffer) { this.buffer = buffer; }
public void run() { CleanerTest.freeDirectBuffer(buffer); }
}
// 显式清理(可选,用于提前释放)
public void close() { cleanable.clean(); }
}