为什么FileInputStream、FileOutputStream等中的finalize方法逐渐被移除了?

JAVA herman 378浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:codedq,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:codedq,之前的微信号好友位已满,备注:返现
饿了么大量招人,我内推!Java 方向!薪资不设上限,工作年龄不限!工作地点限魔都,可电话面试!简历,发我微信:codedq
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

这两天过节放假,到哪都是人山人海。本文我是打算出去跑跑的,但是奈何小孩有课要上,所以最终就去上海交大转了转。结果交大也是人满为患。到处都是人,车进去都能堵十几分钟。

在交大玩的空闲时间,我收到知乎上一个推送。有人问我,为什么FileInputStream、FileOutputStream等中的finalize方法逐渐被移除了?

JDK12 移除finalize方法

说实话,我之前只是了解到,finalize 方法被移除了,但是并没有深究它为什么被移除了。

所以,对于这个问题,我也查阅了一些网上的资料,结果没什么答案来描述这个问题。JDK 官方解释的也很简单,大概意思就是说从 JDK9 开始 finalize 就被弃用了,Java 推荐使用方式是关闭文件的方法是显式调用 close 或使用 try-with-resources。

移除FileInputStream、FileOutputStream、Java.util.ZipFile/Inflator/Deflator的finalize方法

我这里大胆的大脸一下,说一下 finalize 方法为什么被移除。

第一个,这个方法,我们确实用的不多,留着很鸡肋。

第二个,finalize 方法很危险,或者说用不好它很危险。

第三个,从性能上来说,finalize 方法影响 GC 性能。这一点可以从各种 NIO 框架中的 direct memory 的释放并不是通过 finalize() 来感受。

第四个,从 JDK9 开始,有了更好的 Cleaner 机制。这样 try-with-resources 就显得用起来很方便。

第五个,我们在什么时候去调用 close 方法应该是很明确的。如果通过 finalize 方法去关闭流的话,很容易造成遗漏关闭流的情况。

另外,ZipFile/Inflator/Deflator 中的 finalize 方法也被删除了。

我相信 Java 内部应该有一个各 API 调用的一个指标,至少是可以从各开发者或者开源项目中,获取到这个指标。finalize 方法,使用的人太少了,而且还不安全。没必要还让它存在于 Java 之中,就是你想用这个方法,也可以自己简单的去实现一个类似的方法。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号1:xmtxtt(5000人已满),微信号2:xttblog(5000人已满),微信号3:codedq(超3800)。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » 为什么FileInputStream、FileOutputStream等中的finalize方法逐渐被移除了?