信息发布→ 登录 注册 退出

j*a中finalize的重写

发布时间:2025-12-06

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

java中finalize的重写

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 英文版 网奇企业网站管理系统CWMS2.0 英文版

CWMS 2.0功能介绍:一、 员工考勤系统,国内首创CWMS2.0的企业员工在线考勤系统。二、 自定义URL Rewrite重写,友好的搜索引擎 URL优化。三、 代码与模板分离技术,支持超过5种类型的模板类型。包括:文章、图文、产品、单页、留言板。四、 购物车功能,CWMS2.0集成国内主流支付接口。如:淘宝、易趣、快钱等。完全可媲美专业网上商城系统。五、 多语言自动切换 中英文的说明。六、

网奇企业网站管理系统CWMS2.0 英文版 0 查看详情 网奇企业网站管理系统CWMS2.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, new 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的重写的详细内容,更多请关注其它相关文章!


相关文章: Tailwind CSS line-clamp 布局问题解析与修复指南  文心一言怎样用插件调度API数据_文心一言用插件调度API数据【API调用】  如何在CSS中使用浮动制作导航栏_float实现水平菜单  《刺客信条:影》PS5 Pro和Switch 2画面对比  期待已久:小米17 Ultra、小米首款NAS本月登场  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  在python-socketio事件处理器中安全访问Flask应用上下文  在Pyomo中实现基于变量的条件约束:Big-M方法详解  照顾宝贝2小游戏免费秒玩入口  《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!  word中如何让数字纵向排列_Word数字纵向排列方法  NRF24L01数据传输深度解析:解决大载荷接收异常与分包策略  抖音从哪里进入网页版_抖音官方入口链接  Python vgamepad库按键模拟:正确使用XUSB_BUTTON常量  CSS Box Model与弹性按钮:维持布局稳定的动画实践  在FastAPI中利用lifespan与依赖注入高效管理Redis连接池  CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题  c++如何使用Catch2编写单元测试_c++简洁易用的BDD风格测试框架  QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口  智慧团建扫码登录入口 智慧团建扫码登录入口官网版​  win11如何卸载Windows更新补丁 Win11解决更新导致系统不稳定的问题【修复】  使用Python高效删除Word宏并转换DOCM为DOCX格式  AO3最新官网入口公告_2025AO3镜像站实时查询方法  Composer如何解决json扩展缺失的错误  J*a中实现Go语言select通道多路复用机制  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  J*a实现学校排课程序_面向对象结构化项目示例  将HTML动态表格多行数据保存到Google Sheet的教程  解决macOS Tkinter应用双击启动崩溃:PyInstaller打包指南  4399体育竞技小游戏_4399小游戏赛事入口  Golang如何优雅处理error_Golang error处理最佳实践总结  一加 14R 快充无反应_一加 14R 充电优化  vivo云服务网页版登录 怎么登录vivo云服务网页版  PHP中获取MongoDB服务器运行时间(Uptime)的专业指南  sublime怎么格式化代码_sublime代码美化与一键排版插件配置  支付宝如何管理隐私设置_支付宝隐私保护的配置技巧  在J*a中如何使用Stream.map转换元素_Stream映射操作解析  《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情  CSS Grid如何控制元素对齐_align-items与justify-items组合使用  字由网在线版登录地址 字由网网页版安全入口  在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略  iwriter统一登录平台 iwrite账号密码登录页面  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  韩小圈电脑版在线入口_网页版免费登录地址  如何在J*a中实现统一对象行为接口_项目大型化时的接口规范化  谷歌google账号注册详细步骤 谷歌账号注册官方教程  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  知音漫客正版漫画平台_知音漫客官网账号登录  在J*a中如何使用Exception包装底层异常_异常包装与信息传递方法说明 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!