文档章节

为什么要实现finalize()?

 技术盛宴
发布于 02/20 20:33
字数 860
阅读 82
收藏 0

我已经阅读了很多关于finalize()的新手Java问题,发现令人困惑的是,没有人真的说过finalize()是清理资源的不可靠方法。 我看到有人评论说他们使用它来清理Connections,这确实很吓人,因为要保证关闭Connection的唯一方法就是最终实现try(catch)。

我没有在CS上学,但是近十年来我一直在用Java专业编程,而且我从未见过有人在生产系统中实现finalize() 。 这仍然并不意味着它没有其用途,或者与我一起工作的人都在正确地做它。

所以我的问题是,有什么用例可以实现finalize() ,而不能通过语言中的其他过程或语法更可靠地进行处理?

请提供特定的方案或您的经验,仅仅重复一本Java教科书,或最终确定其预期用途是不够的,这不是此问题的意图。


#1楼

自1998年以来,我一直从事Java专业工作,并且从未实现过finalize() 。 不止一次。


#2楼

在编写将由其他开发人员使用的代码时,需要调用某种“清理”方法来释放资源。 有时那些其他开发人员忘记调用您的清理(或关闭或销毁,或其他方法)。 为了避免可能的资源泄漏,您可以签入finalize方法以确保调用了该方法,如果不是,则可以自己调用它。

许多数据库驱动程序在自己的Statement and Connection实现中执行此操作,以为忘记忘记关闭它们的开发人员提供一点安全。


#3楼

您不应该依赖finalize()为您清理资源。 如果是的话,finalize()直到类被垃圾回收后才会运行。 使用完资源后,显式释放资源会更好。


#4楼

您可以将其用作保存外部资源(套接字,文件等)的对象的支持。 实现close()方法并记录需要调用的方法。

如果发现尚未完成,请执行finalize()进行close()处理。 也许有一些东西丢给了stderr以指出您是在有错误的呼叫者之后进行清理的。

在特殊/越野情况下,它提供了额外的安全性。 并非每个呼叫者每次都会正确try {} finally {}东西。 不幸的是,但在大多数环境中都是如此。

我同意几乎不需要它。 正如评论者所指出的,它带有GC开销。 仅在需要长时间运行的应用程序中使用“皮带和吊带”安全性时才使用。

我看到从Java 9开始,不赞成使用Object.finalize() ! 他们将我们指向java.lang.ref.Cleanerjava.lang.ref.PhantomReference作为替代方案。


#5楼

我在生产代码中使用finalize的唯一一次是执行检查,以清除给定对象的资源,如果没有,则记录一条非常明确的消息。 它实际上并没有尝试自己做,如果做得不好,它只会大声喊叫。 原来是相当有用的。

本文转载自:https://stackoom.com/question/f9C/为什么要实现finalize

粉丝 0
博文 1557
码字总数 0
作品 0
深圳
高级程序员
私信 提问
加载中

评论(0)

【Finalizer】Java的Finalizer引发的内存溢出

Java的Finalizer引发的内存溢出 本文介绍的是Java里一个内建的概念,Finalizer。你可能对它对数家珍,但也可能从未听闻过,这得看你有没有花时间完整地看过一遍java.lang.Object类了。在jav...

nj-zhangmq
2016/12/16
35
0
03《Java核心技术》之谈谈final、finally、 finalize有什么不同?

一、提出问题 Java 语言有很多看起来很相似,但是用途却完全不同的语言要素,这些内容往往容易成为面试官考察你知识掌握程度的切入点。 今天,我要问你的是一个经典的 Java 基础题目,谈谈 ...

飞鱼说编程
2018/09/14
78
0
JAVA对象的finalize()方法

finalize java的GC只负责内存相关的清理,所有其它资源的清理必须由程序员手工完成。要不然会引起资源泄露,有可能导致程序崩溃。 调用GC并不保证GC实际执行。 finalize抛出的未捕获异常只会...

o0无忧亦无怖
2019/05/08
25
0
.NET面试题解析(06)-GC与内存管理

转自:http://www.cnblogs.com/anding/p/5260319.html 常见面试题目: 1. 简述一下一个引用对象的生命周期? 2. 创建下面对象实例,需要申请多少内存空间? public class User{ } 3. 什么是垃圾...

莫问今朝乄
2018/02/01
0
0
深入理解java的finalize

基本预备相关知识 1 java的GC只负责内存相关的清理,所有其它资源的清理必须由程序员手工完成。要不然会引起资源泄露,有可能导致程序崩溃。 2 调用GC并不保证GC实际执行。 3 finalize抛出的...

markGao
2013/12/05
394
0

没有更多内容

加载失败,请刷新页面

加载更多

为容器设置启动时要执行的命令及其入参

本页将展示如何为 Pod 中的容器设置启动时要执行的命令及其入参。 准备开始 创建 Pod 时设置命令及入参 使用环境变量来设置入参 通过 shell 来执行命令 注意 接下来 准备开始 你必须拥有一个...

xiaomin0322
10分钟前
16
0
自动化部署工具syncd

一.部署安装 (一)常用安装方式 1. curl https://syncd.cc/install.sh | bash 2. dockerfile安装方式正在测试中 (二)安装参考文档 1.https://syncd.cc/docs/#/install 2.https://github....

浮世清欢-千帆
15分钟前
21
0
如何学习嵌入式?(网上汇总)

如何学习嵌入式?汇总了网上的一些帖子,最后部分给出了一些资源的下载链接 嵌入式菜鸟学习路线,2019, https://zhuanlan.zhihu.com/p/68227075 嵌入式小白到大神学习全攻略(学习路线+课程...

sentuate
15分钟前
14
0
工欲善其事,必先利其器——DevOps中如何管理工具包

一、背景 作为DevOps交付流水线的开发者,为支持CI/CD中各项任务的自动化,都需要依赖多种包管理工具来下载各种相关的工具,比如针对产生最终交付件的构建过程,就需要在构建流程的第一步,自...

JFrog杰蛙
16分钟前
16
0
深度探索JFR - JFR详细介绍与生产问题定位落地 - 2. 通过一个线上调优例子了解JMC 与 Event 结构与详细配置

查看 JFR 事件的工具 - JMC (Java Mission Control) 官网地址:https://adoptopenjdk.net/jmc.html 国内下载起来比较慢,建议在aws上面建一个欧洲法兰克福的实例,在这个实例上先下载好,然...

zhxhash
17分钟前
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部