BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Java将弃用finalize()方法?

| 作者 Ben Evans 关注 21 他的粉丝 ,译者 薛命灯 关注 23 他的粉丝 发布于 2017年3月30日. 估计阅读时间: 2 分钟 | GMTC大前端的下一站,PWA、Web框架、Node等最新最热的大前端话题邀你一起共同探讨。

最近,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?

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT