`
benniaolk
  • 浏览: 36772 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

详解finalize()方法

阅读更多

       网上很多关于面试笔试的一些题目,基本上都问到了同一个问题,finalize()的作用是什么?网上给的答案说的可能比较笼统,今天又重温了一遍Thinking in Java,又回顾了一下finalize()的意义和作用,特意写出来,姑且作为备忘之用。

估计大家对finalize()都有个基本的认识,那就是作清理资源之用。比如在类的某个方法中打开了一个文件,那么你可能需要通过finalize()方法来释放该资源。但是话说回来,java世界里,一切皆对象,而任何一个学java的人都知道,java对象是不需要手动去清理的,因为java有强大的垃圾回收器,有人可能会有疑问,那既然如此,为什么还需要在finalize()中手动释放资源呢?当然,面对这一问题,有很好的理由去解释,因为资源是有限的,而我们又知道垃圾回收器的线程优先级非常低,在逼不得以的情况下,它才会工作,也就是说,只要内存足够,失效的对象就不会被清理,它所持有的资源也就得不到释放,而资源又是有限的,比如数据库连接,所以需要我们去手动释放。不过这一点,在JDK7里面似乎是有所发展,听说是会自动实现这一点,也就是说,sun可能为我们做了这个工作,以后的程序中可能不需要手动释放类似数据库资源的代码了。

如果的确如此,那是不是意味着finalize()就没用了呢?错。不过finalize()确实用到的时候不会很多,它主要用于一些本地方法调用过程中产生的资源清理。比如你通过Native method调用c语言的melloc方法分配了一些内存空间,而这部分内存是需要c语言的free()来进行释放的,如果不这样,就会产生内存泄漏,所以你需要在finalize()中用Native method方法调用free()将其释放。

不过话说回来,finalize()方法并不十分保险,因为finalize()只有在垃圾回收器工作的时候才会被调用,也就是说,通过它进行资源释放并不能确保马上被释放,甚至可能根本不会被释放(因为垃圾回收器可能不会工作),因此,资源释放尽量另想办法,别太相信finalize()和垃圾回收器了。

1
0
分享到:
评论
1 楼 usiboy 2009-12-27  
你也可以参考一下《Effective Java》第二版的第7条:避免使用终结方法

相关推荐

    Java中finalize()详解及用法

    主要介绍了Java中finalize()详解及用法的相关资料,final是Java的关键字,它所表示的是“这部分是无法修改的”,需要的朋友可以参考下

    详解Java编程中final,finalize,finally的区别

    主要介绍了详解Java编程中final,finalize,finally的区别,这个在Java面试题中简直是太常见了...需要的朋友可以参考下

    关于finalize机制和引用、引用队列的用法详解

    C++有析构函数这个东西,能够很好地在对象销毁前...JVM启动的时候,会创建一个Finalizer线程来支持finalize方法的执行。 关于引用和引用队列,java提供了4种引用类型,在垃圾回收的时候,都有自己各自的独特表现。Refe

    Java垃圾回收finalize()作用详解

    Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作,这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。

    详解java中finalize的实现与相应的执行过程

    在常规的java书籍中,即会描述 object的finalize方法是用于一些特殊的对象在回收之前再做一些扫尾的工作,但是并没有说明此是如何实现的.本篇从java的角度(不涉及jvm以及c++),有需要的朋友们可以参考借鉴。

    C#基础:Dispose()、Close()、Finalize()的区别详解

    .net内存回收与Dispose﹐Close﹐Finalize方法一. net的对象使用一般分为三种情况﹕1.创建对象2.使用对象3.释放对象二.创建对象1.创建对象实际分为两个步骤﹕变量类型宣告和初始化对象2.变量类型宣告(declare),如﹕ ...

    sqlite3的使用详解

    下载包中提供了sqlite3.dll、sqlite3.h文件(连接sqlite3必不可少),还有sqlite3的查看工具,以及代码范例。

    杂凑算法详解集V1.1 含C代码 MD5、SHA1、SHA256、SHA512

    详细整理了MD5、SHA1、SHA256、SHA512的算法,如果你有C语言基础,那么看完你就能写出代码了。 内附代码用于理解算法,只经过简单测试,仅供参考,建议自行撰写、... md5_Finalize(&tMD5); printf(tMD5.strResult);

    详解C# 托管资源和非托管资源

    托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源。托管资源的回收工作是不需要人工干预的,有.NET...在.NET中,Object.Finalize()方法是无法重载的,编译器是根据类的析构函数来自动生成O

    【05-面向对象(下)】

    加abstract修饰符,并把普通方法的方法体(也就是方法后花括号括起来的部分)全部去掉,并在方法后增加分号 即可。 抽象类的特征 •抽象类的特征:有得有失,得到了新能力,可以拥有抽象方法;失去了...

    超硬核!!!一篇文章搞定整个JVM的垃圾回收系统

    JVM的垃圾回收机制JVM的垃圾回收机制1 什么是垃圾回收机制2 finalize方法作用3 新生代、老年代、永久代(方法区)的区别3.1 为什么要这样分代:3.2 Minor GC、Major GC、Full GC区别及触发条件4 如何判断对象是否存活...

    leetcode题库-java-interview:Java研发基础相关

    finalize 反射 序列化与反序列化 transient 枚举 注解 JDK7新特性 JDK8新特性 JDK9新特性 JDK10新特性 运行时数据区 对象 OOM & SOF 内存模型 垃圾回收算法 垃圾收集器 内存分配与回收策略 类加载 参数优化 进程与...

    C#中的switch case使用介绍

    c#入门之分支语句使用方法(三元运算符、if语句、switch语句)C#可以减少或不使用switch有什么方法choosesubject c# switchc#多线程编程基础C# 基础之运算符C#基础:Dispose()、Close()、Finalize()的区别详解浅析C

    C#中IDispose接口的实现及为何这么实现详解

    我原本认为对于IDispose的实现方法,只要在里面释放非托管资源就行了,但是通过网上资料,看到很多实现方法并不是仅仅做释放非托管资源,非常迷惑,关键是这些资料也没详细的告诉你为什么这么做?之后通过...

    asp.net sqlconnection con.close和con.dispose区别

    con.close() 是关闭连接,实际上是把连接放回ado.net的连接池,并没有真正关闭,所以再次连接时只是把连接... 您可能感兴趣的文章:C#基础:Dispose()、Close()、Finalize()的区别详解探讨C#中Dispose方法与Close方法的区别

    疯狂JAVA讲义

    6.9.3 finalize方法 228 6.9.4 对象的软、弱和虚引用 230 6.10 修饰符的适用范围 233 6.11 使用JAR文件 234 6.11.1 jar命令详解 235 6.11.2 创建可执行的JAR包 237 6.11.3 关于JAR包的技巧 238 6.12 本章小结...

Global site tag (gtag.js) - Google Analytics