这是Stack Overflow上关于Finalizetion意义的两段讨论,这两个观点是互为补充的。

观点1:

垃圾回收器(The garbage collector)自动在后台运行(虽然它也可以被直接调用,但是一般不这么干),基本上它就是清理那些没有被其他对象引用的对象。(垃圾回收器的整个工作原理要比上面说的复杂,但基本就是这样)。所以它不会改变活动对象(live object)上的任何引用。如果一个对象不能被其他活动对象引用(can not be accessed),那么就意味着它可以被安全地回收。

Finalizetion主要用来释放被对象占用的资源(不是指内存,而是指其他资源,比如文件(File Handle)、端口(ports)、数据库连接(DB Connection)等)。然而,它不能真正有效地工作。

●finalize()的调用事件是不可预知的。

●事实上,没有机制能保证finalize()一定会被调用。

但是即使finalize()被保证一定会被调用,它也不是一个释放资源的好地方;当它被调用准备清理所有你打开的数据库连接(DB Connections)时,系统可能已经耗尽了所有空闲的连接,然后你的app就不能继续跑了。

观点2:

一旦垃圾回收器运行(VM决定它什么时候需要清理内存,你不能强迫它运行)并决定从某个对象(this object)中回收内存时(这意味着已经没有引用(reference)指向这个对象,至少它不是可达(reachable)的对象),在它删除这个对象占用的内存时,它将调用对象上的finalize()方法。你可以肯定的是如果进行了垃圾回收,那么在对象消失(dispperars)前finalize()方法会被调用,但你无法确定它是否会被GC回收,所以你不能依赖这个方法做清理工作。你应该在finally{}里面做清理工作,不要使用finalize()方法,因为它不一定保证会被运行。

从以上观点总结:GC是用来回收对象占用的内存的,而finalize()这个东西会被finalizer调用,用来回收资源(文件、端口、数据库连接等)。

本文内容翻译自What is the purpose of Finalization in java?

扯扯Java中Finalization的意义的更多相关文章

  1. java中final的意义

    1.如果一个数据既是static又是final,那么它会拥有一块无法改变的存储空间. 2.final data: 当final用于基本数据类型时,final让其值(value)保持不变,但是当用于ob ...

  2. [转]Java中this的意义

    1. this 指的不是成员变量还是方法里的参数值指得是这个类自身 class a{int i = 0;public void aa(){System.out.print(i);}public voi ...

  3. java中+=与+的区别

    public class QQ { public static void main(String[] args) throws ParseException { byte val1 = 5; doub ...

  4. 扯扯Java中的锁

    前言 又过去了一个周末,最近陆陆续续的看了<并发编程的艺术>一书,对锁有不少感悟,这次就聊聊Java中的锁事.本文纯粹是漫谈,想到哪说到哪,但准确性肯定会保证,倘若有不正确之处,还请交流指 ...

  5. [转]Java中fina以及static的意义

    一.final        根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效 ...

  6. Java中的抽象类详解,它存在的意义在哪里?

    学习抽象类前先理解下面这段话: 问你个问题,你知道什么是"东西"吗?什么是"物体"吗? "麻烦你,小王.帮我把那个东西拿过来好吗" 在生活中 ...

  7. Java与Python中的‘%’运算符意义一样么?

    1. 取余与取模 百度百科对于取模运算做了如下定义: 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = [a/b]; 2.计算模或者余数: r = a - c*b. 求 ...

  8. Java中的关键字有哪些?「Java中53个关键字的意义及使用方法」

    Java中的关键字有哪些? 1)48个关键字:abstract.assert.boolean.break.byte.case.catch.char.class.continue.default.do. ...

  9. Java 中的纤程库 – Quasar

    来源:鸟窝, colobu.com/2016/07/14/Java-Fiber-Quasar/ 如有好文章投稿,请点击 → 这里了解详情 最近遇到的一个问题大概是微服务架构中经常会遇到的一个问题: 服 ...

随机推荐

  1. Changing SharePoint Default port ( 80 ) to another port ( 79 ).

      Introduction In this How-To I will change my port from 80 to 79, probably because I want to host s ...

  2. 更好更快更高效解析JSON说明

    现在来一个实例解析类,直接就把解析JSON到QVariant去了.唯一不足的是没有搞错误处理,具体方法也请各位自行参考json-c的发行文档,这样比较方便叙述,STL或者Boost我都没有认真接触过, ...

  3. Docker常用操作

    启动容器并安装package docker run xxx apt-get -y xxx 其中-y要加上避免无法交互 批量删除容器 docker ps -a | awk '{print $1}' |x ...

  4. Ubuntu12.04-x64编译Hadoop2.2.0和安装Hadoop2.2.0集群

      本文Blog地址:http://www.cnblogs.com/fesh/p/3766656.html   本文对Hadoop-2.2.0源码进行重新编译(64位操作系统下不重新编译会有版本问题) ...

  5. IE调试网页之四:F12 开发人员工具控制台错误消息 (Windows)(转载)

    F12 工具控制台可以报告在运行时期间发生的错误和信息消息.本文将介绍错误消息,并提供有关如何修正这些错误的建议. 简介 F12 工具控制台错误消息提供了一些代码(例如,SEC7111 或 HTML1 ...

  6. hdu 1757 A Simple Math Problem (乘法矩阵)

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  7. Unity(二)生命周期LifetimeManager

    描述:Unity的生命周期是注册的类型对象的生命周期,而Unity默认情况下会自动帮我们维护好这些对象的生命周期,我们也可以显示配置对象的生命周期,Unity将按照配置自动管理. //创建一个Unit ...

  8. 如何通过maven ,将本地jar 安装到仓库中去。

    场景: 现在很多公司,都有 maven 的私服 ,在maven项目中,基本上有两个仓库 ,一个是maven的公共仓库,一个是私服仓库: 有的时候,我们download 别人的代码的时候,pom文件中报 ...

  9. nginx 的基础配置[转]

    nginx 的基础配置 分类: 工具软件2013-11-13 23:26 11人阅读 评论(0) 收藏 举报   目录(?)[-] 管理配置文件 全局配置 虚拟机server配置 location配置 ...

  10. 命令行参数 main()函数设计

    一.main()函数的形式 int main( void )--无参数形式 { ... return 0; } int main( int argc, char *argv[] )--带参数形式 { ...