zoukankan      html  css  js  c++  java
  • 对象方法(转载)Java中finalize的使用

    今天个人几篇文章介绍了改对象方法的文章. 关联文章的地址

        java供提finalize()方法,圾垃收回器备准释放存内的时候,会先调用finalize()。

        (1).对象一不定会被收回。

        (2).圾垃收回不是构析数函。

        (3).圾垃收回只与存内有关。

        (4).圾垃收回和finalize()都是靠不住的,只要JVM还没有快到耗尽存内的田地,它是不会浪费时间行进圾垃收回的。

        偶然当撤消一个对象时,须要现实一些操纵。例如,如果一个对象正在理处的非是Java 资源,如文件句柄或window 字符字体,这时你要确认在一个对象被撤消前以要保障这些资源被释放。为理处这样的况状,Java 供提了被称为尾收(finalization )的制机。应用该制机你可以定义一些殊特的操纵,这些操纵在一个对象将要被圾垃收回序程释放时行执。

        要给一个类加增尾收(finalizer ),你只要定义finalize ( ) 方法可即。Java 收回该类的一个对象时,就会调用这个方法。在finalize ( )方法中,你要指定在一个对象被撤消前必须行执的操纵。圾垃收回周期性地行运,检查对象不再被行运态状引用或间接地通过对象引用。就在对象被释放之前,Java 行运系统调用该对象的finalize( ) 方法。其他

        finalize()方法的通用式格如下:

        protected void finalize( )

        {

        // finalization code here

        }

        其中,键关字protected是止防在该类外之定义的代码问访finalize()标识符。该标识符和其他标识符将在第7章中解释。

        懂得finalize( ) 正好在圾垃收回前以被调用非常要重。例如当一个对象超出了它的作用域时,finalize( ) 其实不被调用。这意味着你不可能道知何时——甚至是不是——finalize( ) 被调用。因此,你的序程该应供提其他的方法来释放由对象应用的系统资源,而不能依托finalize( ) 来现实序程的畸形操纵。

        注意:如果你熟习C ,那你道知C 许允你为一个类定义一个撤消数函(destructor ),它在对象正好出作用域之前被调用。Java不持支这个设法也不供提撤消数函。finalize() 方法只和撤消数函的能功近接。当你对Java 有丰硕教训时,你将看到因为Java应用圾垃收回子系统,几乎没有必要应用撤消数函。

        懂得finalize()-构析数函的替代者

        by Tim Gooch

        在许多方面,Java 类似于 C++。Java 的语法非常类似于 C++,Java 有类、方法和数据成员;Java 的类有造构数函; Java 有异常理处。

        但是,如果你应用过 C++ 会发明 Java 也丢掉一些多是你熟习的特性。这些特性之一就是构析数函。代取应用构析数函,Java 持支finalize() 方法。

        在本文中,我们将描述 finalize() 与 C++ 构析数函的别区。另外,我们将建创一个单简的 Applet 来演示 finalize() 是如何的。作工

        终最的限界

        与 Java 不同,C++ 持支局部对象(基于栈)和全局对象(基于堆)。因为这一两重持支,C++ 也供提了动自造构和构析,这致使了对造构数函和构析数函的调用,(对于堆对象)就是存内的分配和释放。

        在 Java 中,有所对象都驻留在堆存内,因此局部对象就不存在。结果,Java 的设计者得觉不须要构析数函(象 C++ 中所现实的)。

        取而代之,Java 定义了一个殊特的方法叫做finalize() ,它供提了 C++ 构析数函的一些能功。但是,finalize() 其实不全完与 C++ 的构析数函一样,并可以设假它会致使一系列的问题。finalize() 方法作用的一个键关元素是 Java 的圾垃收回器。

        圾垃收回器

        在 C/C++、Pascal和其他几种多种途用的编程语言中,开发者有任责在存内管理上施展踊跃的作用。例如,如果你为一个对象或数据结构分配了存内,那么当你不再应用它时必须释放掉该存内。

        每日一道理
    试试看——不是像企鹅那样静静的站在海边,翘首企盼机会的来临,而是如苍鹰一般不停的翻飞盘旋,执著的寻求。 试试看——不是面对峰回路转、杂草丛生的前途枉自嗟叹,而是披荆斩棘,举步探索。 试试看——不是拘泥于命运的禁锢,听凭命运的摆布,而是奋力敲击其神秘的门扉,使之洞开一个新的天地。微笑着,去唱生活的歌谣。

        在 Java 中,当你建创一个对象时,Java 虚拟机(JVM)为该对象分配存内、调用造构数函并开始跟踪你应用的对象。当你停止应用一个对象(就是说,当没有对该对象有效的引用时),JVM 通过圾垃收回器将该对象标记为释放态状。

        当圾垃收回器将要释放一个对象的存内时,它调用该对象的finalize() 方法(如果该对象定义了此方法)。圾垃收回器以立独的低优先级的方法行运,只有当其他程线挂起等待该存内释放的情况出现时,它才开始行运释放对象的存内。(事实上,你可以调用System.gc() 方法强制圾垃收回器来释放这些对象的存内。)

        在以上的描述中,有一些要重的事件须要注意。首先,只有当圾垃收回器释放该对象的存内时,才会行执finalize()。如果在 Applet 或应用序程退出之前圾垃收回器没有释放存内,圾垃收回器将不会调用finalize()。

        其次,除非圾垃收回器以为你的 Applet 或应用序程须要额定的存内,否则它不会试图释放不再应用的对象的存内。换句话说,这是全完可能的:一个 Applet 给少许的对象分配存内,没有成造重严的存内需求,于是圾垃收回器没有释放这些对象的存内就退出了。

        然显,如果你为某个对象定义了finalize() 方法,JVM 可能不会调用它,因为圾垃收回器不曾释放过那些对象的存内。调用System.gc() 也不会起作用,因为它仅仅是给 JVM 一个提议而不是命令。

        finalize() 有什么点优呢?

        如果finalize() 不是构析数函,JVM 一不定会调用它,你可能会困惑它是不是在任何情况下都有利益。事实上,在 Java 1.0 中它并没有太多的点优。

        根据 Java 文档,finalize() 是一个于用释放非 Java 资源的方法。但是,JVM 有很大的可能不调用对象的finalize() 方法,因此很难明证应用该方法释放资源是有效的。

        Java 1.1 通过供提一个System.runFinalizersOnExit() 方法部分地决解了这个问题。(不要将这个方法与 Java 1.0 中的System.runFinalizations() 方法相淆混。)不象System.gc() 方法那样,System.runFinalizersOnExit() 方法其实不当即试图启动圾垃收回器。而是当应用序程或 Applet 退出时,它调用每一个对象的finalize() 方法。

        正如你可能猜想的那样,通过调用System.runFinalizersOnExit() 方法强制圾垃收回器清除有所立独对象的存内,当清除代码行执时可能会引起显明的延迟。当初建立一个示例 Applet 来演示 Java 圾垃收回器和finalize() 方法是如何相互作用的。

        收回圾垃

        通过应用Java Applet Wizard 建创一个新的 Applet 开始。当提示这样做时,入输final_things作为 Applet 名,并选择不要生成源文件释注。

        接下来,在Java Applet Wizard 行进第三步,不要选择多程线选项。在第五步之前,根据须要修改 Applet 的描述。

        当你单击Finish 后,Applet Wizard 将生成一个新的作工间空,并为该项目建创省缺的 Java 文件。从列表 A 中选择恰当的代码入输(我们经已凸起表现了你须要入输的代码)。

        当你现实代码的入输后,置配Internet 浏览器将System.out 的输出息信写到Javalog.txt 文件中。(在IE 选项对话框的高等页面中选择升引 Java Logging。)

        编译并行运该 Applet。然后,等待 Applet 行运(你将在态状栏中看到 Applet 已启动的息信),退出浏览器,并打开Javalog.txt 文件。你将会发明类似于列下行的息信:

        1000 things constructed

        0 things finalized

        正如你够能看到的那样,建立了1,000个对象仍然没有迫使圾垃收回器开始收回间空,即使在 Applet 退出时也没有对象被应用。

        当初,删除在stop() 方法第一行中的释注符以升引System.gc() 方法。再次编译并行运该 Applet ,等待 Applet 现实行运,并退出浏览器。当你再次打开Javalog.txt 文件,你将看到列下行:

        1000 things constructed

        963 things finalized

        次这,圾垃收回器以为大多数对象未被应用,并将它们收回。按序顺,当圾垃收回器开始释放这些对象的存内时,JVM 调用它们的finalize() 方法。

        继承finalize()?

        趁便,如果你在类中定义了finalize() ,它将不会动自调用基类中的方法。在我们探讨了finalize() 与 C++ 的构析数函的不同点后,对这个论断不会惊奇,因为为某个类定制的清除代码另一个类一不定会须要。

        如果你决定要通过生派一个类的finalize() 方法来调用基类中的finalize() 方法,你可以象其他继承方法一样理处。

        protected void finalize()

        {

        super.finalize();

        // other finalization code...

        }

        除了许允你控制是不是行执清除操纵外,这个技巧还使你可以控制前当类的finalize() 方法何时行执。

        论断

        然而有利的是,Java 的动自圾垃收回器不会失去平衡。作为方便的价值,你不得不废弃对系统资源释放的控制。不象 C++ 中的构析数函,Java Applet 不会动自行执你的类中的finalize() 方法。事实上,如果你正在应用 Java 1.0,即使你试图强制它调用finalize() 方法,也不能保确将调用它。

        因此,你不该应依托finalize() 来行执你的 Applet 和应用序程的资源清除作工。取而代之,你该应明白的清除那些资源或建创一个try...finally 块(或类似的制机)来现实。

        

        这篇文章对GC描述得很细详,就转一下吧:转自:chinaitlab

    文章结束给大家分享下程序员的一些笑话语录: IBM和波音777
      波音777是有史以来第一架完全在电脑虚拟现实中设计制造的飞机,所用的设备完全由IBM公司所提供。试飞前,波音公司的总裁非常热情的邀请IBM的技术主管去参加试飞,可那位主管却说道:“啊,非常荣幸,可惜那天是我妻子的生日,So..”..
      波音公司的总载一听就生气了:“胆小鬼,我还没告诉你试飞的日期呢!”

  • 相关阅读:
    解决-bash: fork: retry: Resource temporarily unavailable错误
    Python虚拟环境--virtualenv
    Docker三大核心概念之镜像
    LRU cache 实现
    二叉树常见算法总结和C++实现
    跳表原理及C++实现
    结构笔记—串的基本操作及串的模式匹配算法
    Bloom Filter布隆过滤器原理和实现(2)
    Bloom Filter布隆过滤器原理和实现(1)
    bitmap位图原理和实现
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3061723.html
Copyright © 2011-2022 走看看