专家分享选择开源和自研道路上的考量以及具体的业务案例,点击查看 了解详情
写点什么

Java 将弃用 finalize() 方法?

  • 2017 年 3 月 29 日
  • 本文字数:720 字

    阅读完需:约 2 分钟

最近,OpenJDK 邮件组 core-libs-dev 里出现了一封邮件,建议弃用Object 类的finalize() 方法。

弃用Object 类的方法将会是一件非常不寻常的事情。Java 从 1.0 开始就有了finalize() 方法,不过这个方法一直被认为是一个糟糕的设计,也是Java 平台的一个遗留的大“毒瘤”。

垃圾回收器会特别对待覆盖了finalize() 方法的对象。一般情况下,在垃圾回收期间,一个无法触及的对象会立即被销毁。不过,覆盖了finalize() 方法的对象会被移动到一个队列里,一个独立的线程遍历这个队列,调用每一个对象的finalize() 方法。在finalize() 方法调用结束之后,这些对象才成为真正的垃圾,等待下一轮垃圾回收。

Java 的这种机制与 C++ 里的 RAll 模式类似,创建对象的时候分配资源(比如文件句柄),在销毁对象时自动释放资源。

不过,析构并不能安全地实现资源的自动管理,因为垃圾回收器并没有运行时间上的保证。也就是说,并不存在任何一种机制可以把资源的释放与对象的生命周期完全绑定在一起,如果处理不好还会耗尽资源。

析构的使用已经偏离了它的设计初衷。

多年来,Oracle(以及之前的 Sun)建议开发者避免在一般的应用里使用析构。弃用析构意味着向彻底移除迈出了第一步,不过现在能做的也就是在使用析构时给出编译警告。

现在并没有任何有关彻底移除析构机制的时间表,部分原因是因为 Java 平台上仍然存在一些使用析构的场景,这些场景与资源使用的管理并没有联系。已经有人在考虑如何对这些场景进行迁移,以便移除对析构机制的依赖。

如果 Java 9 不会弃用析构(看起来不太可能),那么最早有可能会在 Java 10 里弃用。不过,最终是不是会在 Java 10 里弃用,或者在更晚的版本里,目前尚无定论。

查看英文原文: Java finalization to be deprecated?

2017 年 3 月 29 日 19:005359
用户头像

发布了 321 篇内容, 共 119.2 次阅读, 收获喜欢 126 次。

关注

评论

发布
暂无评论
发现更多内容

缓存技术和直播平台缓存总结

周冬辉

RxJS学习总结

真嗣

RXJS

技术选型:如何构建技术选型方法论

CHEN川

极客大学架构师训练营 技术选型

第五周学习总结

李白

一致性哈希算法分析与go语言实现

superman

极客大学架构师训练营 一致性Hash算法 Go 语言

大型网站技术架构--架构篇

wei

单体架构知识点及单体架构的缺陷

古月木易

单体架构

架构师训练营」第 5 周作业

edd

极客大学架构师训练营

致那些高考结束的同学们

小天同学

读书 读书感悟 高考

week5. 课后作业

dj_cd

啃碎并发(六):Java线程同步与实现

猿灯塔

分布式事务精华总结篇

古月木易

分布式 分布式事务

一致性Hash

梅子黄时雨

极客大学架构师训练营

分布式事务精华总结篇

奈学教育

分布式 分布式事务

十代酷睿凌云!开启游戏本新篇章的机械师“战空”F117-V

最新动态

Week 05 总结

鱼_XueTr

缓存 分布式数据库 消息队列

第五周作业 - 一致性 hash 实现

netbanner

极客大学架构师训练营

架构师训练营第五周学习总结

whiter

极客大学架构师训练营

单体架构知识点及单体架构的缺陷

奈学教育

单体架构

week5 学习总结

任小龙

架构师第五周总结

suke

极客大学架构师训练营

作业一:一致性hash实现

孙强

Lesson 5 分布式系统架构- 分布式缓存和队列 心得笔记

edd

架构师训练营第五周总结

架构师 极客大学架构师训练营

架构0期Week5Work1

Nan Jiang

架构师训练营第五周作业

James-Pang

极客大学架构师训练营

第5周总结

andy

架构师训练营第5周总结:缓存,消息队列,负载均衡,分布式数据库

hifly

负载均衡 缓存 分布式数据库 极客大学架构师训练营 消息队列

【获奖名单公示】仅需发布3篇+文章,极客时间每日一课 VIP 等多重礼品,免费拿~

InfoQ写作社区官方

写作平台 征稿 热门活动

第5周作业

andy

架构师第五周作业

suke

极客大学架构师训练营

面向体验的视频云-火山引擎增长沙龙

面向体验的视频云-火山引擎增长沙龙

Java将弃用finalize()方法?_Java_Ben Evans_InfoQ精选文章