HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

Java 将弃用 finalize() 方法?

  • 2017-03-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-03-29 19:005830
用户头像

发布了 322 篇内容, 共 140.1 次阅读, 收获喜欢 145 次。

关注

评论

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

从云计算到 Serverless

刘宇

云计算 Serverless 云原生 Serverless Devs

Serverless 架构简介

刘宇

云计算 Serverless 云原生 Serverless Devs

Spring Boot 2 教程:WebFlux 集成 Thymeleaf 、 Mongodb 实践(六)

程序员泥瓦匠

Spring Boot 2 教程:WebFlux 中 Redis 实现缓存(八)

程序员泥瓦匠

Linux之rm命令

入门小站

Linux

Elasticsearch 查询最大时间(qbit)

qbit

sql UTC TimeZone 时区

Spring Boot 2 教程:WebFlux Restful CRUD 实践(三)

程序员泥瓦匠

Spring Boot WebFlux

openLooKeng社区Apache Log4j2高危安全漏洞修复完成,建议用户升级

openLooKeng

大数据 安全漏洞 openLooKeng Apache Log4j2 远程代码执行

Serverless Devs 简介

刘宇

Serverless 函数计算 Serverless Devs

阿里云函数计算(FC)组件简介

刘宇

云计算 Serverless 云原生 函数计算 Serverless Devs

Homebrew大神面试Google被拒,只因写不出一道算法题

博文视点Broadview

鸿蒙轻内核源码分析:MMU协处理器

华为云开发者联盟

鸿蒙 MMU协处理器 ARM CP15协处理器 协处理器 MMU

Spring Boot 2 教程:WebFlux 系列教程大纲(一)

程序员泥瓦匠

Spring Boot WebFlux

前端开发React使用中常用的开发框架

@零度

前端 React

Serverless Devs 新手引导

刘宇

云计算 Serverless 云原生 Serverless Devs 新手引导

Spring Boot 2 教程:WebFlux 集成测试及部署(十)

程序员泥瓦匠

一文带你熟知ForkJoin

华为云开发者联盟

jdk 并发编程 并发 forkjoin 多线程并发

java开发之Redis分布式锁相关知识分享

@零度

Java redis

Spring Boot 2 教程:WebFlux 快速入门实践(二)

程序员泥瓦匠

Spring Boot WebFlux

Spring Boot 2 教程:WebFlux 集成 Thymeleaf(五)

程序员泥瓦匠

Vue中slot插槽的使用方法

Changing Lin

12月日更

Java常用的五大算法详解

编程江湖

算法 java编程

成功只有一种-OBKoro1的2021年终总结

OBKoro1

前端 年终总结

多种操作模式下的工具体系

刘宇

Serverless Serverless Devs

让发布更安全的:线上异动感知

刘宇

云计算 Serverless 云原生 Serverless Devs

Spring Boot 2 教程:WebFlux 整合 Mongodb(四)

程序员泥瓦匠

Spring Boot WebFlux

Linux一学就会:shell脚本基础

侠盗安全

Linux linux运维 运维工程师 云计算架构师

工具链建设的必要性

刘宇

云计算 Serverless 云原生 工具链

重磅来袭|第一届 OpenSEC 征文活动正式开启

SphereEx

开源社区 技术分享 ShardingSphere SphereEx OpenSEC

Spring Boot 2 教程:WebFlux 整合 Redis(七)

程序员泥瓦匠

Spring Boot 2 教程:WebFlux 中 WebSocket 实现通信(九)

程序员泥瓦匠

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