本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
这两天过节放假,到哪都是人山人海。本文我是打算出去跑跑的,但是奈何小孩有课要上,所以最终就去上海交大转了转。结果交大也是人满为患。到处都是人,车进去都能堵十几分钟。
在交大玩的空闲时间,我收到知乎上一个推送。有人问我,为什么FileInputStream、FileOutputStream等中的finalize方法逐渐被移除了?
说实话,我之前只是了解到,finalize 方法被移除了,但是并没有深究它为什么被移除了。
所以,对于这个问题,我也查阅了一些网上的资料,结果没什么答案来描述这个问题。JDK 官方解释的也很简单,大概意思就是说从 JDK9 开始 finalize 就被弃用了,Java 推荐使用方式是关闭文件的方法是显式调用 close 或使用 try-with-resources。
我这里大胆的大脸一下,说一下 finalize 方法为什么被移除。
第一个,这个方法,我们确实用的不多,留着很鸡肋。
第二个,finalize 方法很危险,或者说用不好它很危险。
第三个,从性能上来说,finalize 方法影响 GC 性能。这一点可以从各种 NIO 框架中的 direct memory 的释放并不是通过 finalize() 来感受。
第四个,从 JDK9 开始,有了更好的 Cleaner 机制。这样 try-with-resources 就显得用起来很方便。
第五个,我们在什么时候去调用 close 方法应该是很明确的。如果通过 finalize 方法去关闭流的话,很容易造成遗漏关闭流的情况。
另外,ZipFile/Inflator/Deflator 中的 finalize 方法也被删除了。
我相信 Java 内部应该有一个各 API 调用的一个指标,至少是可以从各开发者或者开源项目中,获取到这个指标。finalize 方法,使用的人太少了,而且还不安全。没必要还让它存在于 Java 之中,就是你想用这个方法,也可以自己简单的去实现一个类似的方法。
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 为什么FileInputStream、FileOutputStream等中的finalize方法逐渐被移除了?