快速业务通道

深入浅出Java堆的管理 - 垃圾回收 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
void finalize() throws throwable

在finalize()方法返回之后,对象消失,垃圾收集开始执行。原型中的throwsthrowable表示它可以抛出任何类型的异常。

之所以要使用finalize(),是由于有时需要采取与java的普通方法不同的一种方法,通过分配内存来做一些具有c风格的事情。这主要可以通过固有方法来进行,它是从java里调用非java方法的一种方式。c和c是目前唯一获得固有方法支持的语言。但由于它们能调用通过其他语言编写的子程序,所以能够有效地调用任何东西。在非java代码内部,也许能调用c的malloc()系列函数,用它分配存储空间。而且除非调用了free(),否则存储空间不会得到释放,从而造成内存漏洞的出现。当然,free()是一个c和c函数,所以我们需要在finalize()内部的一个固有方法中调用它。也就是说我们不能过多地使用finalize(),它并不是进行普通清除工作的理想场所。

在普通的清除工作中,为清除一个对象,那个对象的用户必须在希望进行清除的地点调用一个清除方法。这与c破坏器的概念稍有抵触。在c中,所有对象都会破坏(清除)。或者换句话说,所有对象都应该破坏。若将c对象创建成一个本地对象,比如在堆栈中创建(在java中是不可能的),那么清除或破坏工作就会在结束花括号所代表的、创建这个对象的作用域的末尾进行。若对象是用new创建的(类似于java),那么当程序员调用c的delete命令时(java没有这个命令),就会调用相应的破坏器。若程序员忘记了,那么永远不会调用破坏器,我们最终得到的将是一个内存漏洞,另外还包括对象的其他部分永远不会得到清除。

相反,java不允许我们创建本地(局部)对象--无论如何都要使用new。但在java中,没有delete命令来释放对象,因为垃圾收集器会帮助我们自动释放存储空间。所以如果站在比较简化的立场,我们可以说正是由于存在垃圾收集机制,所以java没有破坏器。然而,随着以后学习的深入,就会知道垃圾收集器的存在并不能完全消除对破坏器的需要,或者说不能消除对破坏器代表的那种机制的需要(而且绝对不能直接调用finalize(),所以应尽量避免用它)。若希望执行除释放存储空间之外的其他某种形式的清除工作,仍然必须调用java中的一个方法。它等价于c的破坏器,只是没后者方便。

深入浅出Java堆的管理 - 垃圾回收(4)

时间:2011-01-04

下面这个例子向大家展示了垃圾收集所经历的过程,并对前面的陈述进行了总结。

class Chair { static boolean gcrun = false; static boolean f = false; static int created = 0; static int finalized = 0; int i; Chair() {  i = ++created;  if(created == 47)    System.out.println("Created 47"); } protected void finalize() {  if(!gcrun) {   gcrun = true;   System.out.println("Beginning to finalize after " + created + " Chairs have been created");  }  if(i == 47) {   System.out.println("Finalizing Chair #47, " +"Setting flag to stop Chair creation");   f = true;  }  finalized++;  if(finalized >= created)   System.out.println("All " + finalized + " finalized"); }}public class Garbage { public static void main(String[] args) {  if(args.length == 0) {   System.err.println("Usage: \n" + "java Garbage before\n or:\n" + "java Garbage after");   return;  }  while(!Chair.f) {   new Chair();   new String("To take up space");  }  System.out.println("After a

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号