关于JAVA垃圾收集器与类的finalize()方法的一些总结

转载 2006年06月24日 15:31:00

关于JAVA垃圾收集器与类的finalize()方法的一些总结

摘自网站www.matrix.org.cn

1.垃圾收集器的工作目标是回收已经无用的对象的内存空间,从而避免内存渗漏体的产生,节省内存资源,避免程序代码的崩溃。
2.垃圾收集器判断一个对象的内存空间是否无用的标准是:如果该对象不能再被程序中任何一个"活动的部分"所引用,此时我们就说,该对象的内存空间已经无用。所谓"活动的部分",是指程序中某部分参与程序的调用,正在执行过程中,尚未执行完毕。
3.垃圾收集器线程虽然是作为低优先级的线程运行,但在系统可用内存量过低的时候,它可能会突发地执行来挽救内存资源。当然其执行与否也是不可预知的。
4.垃圾收集器不可以被强制执行,但程序员可以通过调用System. gc方法来建议执行垃圾收集器。 5.不能保证一个无用的对象一定会被垃圾收集器收集,也不能保证垃圾收集器在一段Java语言代码中一定会执行。因此在程序执行过程中被分配出去的内存空间可能会一直保留到该程序执行完毕,除非该空间被重新分配或被其他方法回收。由此可见,完全彻底地根绝内存渗漏体的产生也是不可能的。但是请不要忘记,Java的垃圾收集器毕竟使程序员从手工回收内存空间的繁重工作中解脱了出来。设想一个程序员要用C或C++来编写一段10万行语句的代码,那么他一定会充分体会到Java的垃圾收集器的优点!
6.同样没有办法预知在一组均符合垃圾收集器收集标准的对象中,哪一个会被首先收集。
7.循环引用对象不会影响其被垃圾收集器收集。
8.可以通过将对象的引用变量(reference variables,即句柄handles)初始化为null值,来暗示垃圾收集器来收集该对象。但此时,如果该对象连接有事件监听器(典型的 AWT组件),那它还是不可以被收集。所以在设一个引用变量为null值之前,应注意该引用变量指向的对象是否被监听,若有,要首先除去监听器,然后才可以赋空值。
9.每一个对象都有一个finalize( )方法,这个方法是从Object类继承来的。
10.finalize( )方法用来回收内存以外的系统资源,就像是文件处理器和网络连接器。该方法的调用顺序和用来调用该方法的对象的创建顺序是无关的。换句话说,书写程序时该方法的顺序和方法的实际调用顺序是不相干的。请注意这只是finalize( )方法的特点。
11.每个对象只能调用finalize( )方法一次。如果在finalize( )方法执行时产生异常(exception),则该对象仍可以被垃圾收集器收集。
12.垃圾收集器跟踪每一个对象,收集那些不可到达的对象(即该对象没有被程序的任何"活的部分"所调用),回收其占有的内存空间。但在进行垃圾收集的时候,垃圾收集器会调用finalize( )方法,通过让其他对象知道它的存在,而使不可到达的对象再次"复苏"为可到达的对象。既然每个对象只能调用一次finalize( )方法,所以每个对象也只可能"复苏"一次。
13.finalize( )方法可以明确地被调用,但它却不能进行垃圾收集。
14.finalize( )方法可以被重载(overload),但只有具备初始的finalize( )方法特点的方法才可以被垃圾收集器调用。
15.子类的finalize( )方法可以明确地调用父类的finalize( )方法,作为该子类对象的最后一次适当的操作。但Java编译器却不认为这是一次覆盖操作(overriding),所以也不会对其调用进行检查。
16.当finalize( )方法尚未被调用时,System. runFinalization( )方法可以用来调用finalize( )方法,并实现相同的效果,对无用对象进行垃圾收集。
17.当一个方法执行完毕,其中的局部变量就会超出使用范围,此时可以被当作垃圾收集,但以后每当该方法再次被调用时,其中的局部变量便会被重新创建。
18.Java语言使用了一种"标记交换区的垃圾收集算法"。该算法会遍历程序中每一个对象的句柄,为被引用的对象做标记,然后回收尚未做标记的对象。所谓遍历可以简单地理解为"检查每一个"。
19.Java语言允许程序员为任何方法添加finalize( )方法,该方法会在垃圾收集器交换回收对象之前被调用。但不要过分依赖该方法对系统资源进行回收和再利用,因为该方法调用后的执行结果是不可预知的。 通过以上对垃圾收集器特点的了解,你应该可以明确垃圾收集器的作用,和垃圾收集器判断一块内存空间是否无用的标准。简单地说,当你为一个对象赋值为null并且重新定向了该对象的引用者,此时该对象就符合垃圾收集器的收集标准。

java中的垃圾回收之finalize()用法

简介   我们都知道,java有垃圾回收器专门负责回收无用对象占据的内存资源。所以我们一般不需要去清理没用的对象内存空间(类似于C++中的析构函数)。但是也有特殊情况,假设对象不是通过new得到的内...
  • victoryjack
  • victoryjack
  • 2016年04月26日 11:31
  • 1145

【Java】finalize()和垃圾回收机制

finalize()方法:一旦gc准备释放对象占用的存储空间,将首先调用finalize()方法,并在下一次垃圾回收动作发生时才会真正回收内存。可在此进行重要的清理操作。gc只能释放那些经由new分配...
  • youyaecho
  • youyaecho
  • 2016年05月19日 11:22
  • 383

【Java 基础】Java垃圾回收机制 finalize() 方法

finalize() 方法   Java允许定义这样的方法,它在对象被垃圾收集器析构(回收)之前调用,这个方法叫做finalize( ),它用来清除回收对象(一些东西,不一定是对象)。 例如,你可...
  • leaf_130
  • leaf_130
  • 2016年05月18日 09:42
  • 452

JAVA垃圾收集器finalize()方法的一些总结

关于JAVA垃圾收集器与类的finalize()方法的一些总结摘自网站www.matrix.org.cn1.垃圾收集器的工作目标是回收已经无用的对象的内存空间,从而避免内存渗漏体的产生,节省内存资源,...
  • GilBert1987
  • GilBert1987
  • 2008年10月02日 19:02
  • 426

Java中的finalize方法理解

首先:system.gc()并不是你调用就马上执行的, 而是根据虚拟机的各种算法来来计算出执行垃圾回收的时间,另外,程序自动结束时不会执行垃圾回收的。 其次:对象被回收时,要经过两次标记,第一次标记...
  • q35445762
  • q35445762
  • 2015年07月16日 23:18
  • 1274

Effective Java(Java中的finalize与垃圾回收机制)

在第7条避免使用终结方法中提到的finalize(),于是在查阅finalize()的时候有提到了垃圾回收机制,便一起阅读以下,记下一点笔记 改天记之。。。 参考: http://my.osc...
  • molu_chase
  • molu_chase
  • 2016年07月13日 01:02
  • 190

Java中终结处理和垃圾回收(finalize方法介绍)

作为Java的初学者,我一直
  • fangyaoyu
  • fangyaoyu
  • 2014年08月27日 22:04
  • 561

Java垃圾收集器与类的finalize()方法总结

1.垃圾收集器的工作目标是回收已经无用的对象的内存空间,从而避免内存渗漏体的产生,节省内存资源,避免程序代码的崩溃。 2.垃圾收集器判断一个对象的内存空间是否无用的标准是:如果该对象不能再被程序...
  • sinat_33747044
  • sinat_33747044
  • 2016年08月24日 13:00
  • 44

【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解

一、Object中所有方法简介: 在根类Object中包含一下方法:  clone();equals();finalize();getClass();[align=left][/align]noti...
  • cangchen
  • cangchen
  • 2015年04月10日 12:33
  • 1644

java垃圾回收机制

垃圾收集器系统有自己的一套方案来判断哪个内存块是应该被回收 的, 哪个是不符合要求暂不回收的。 垃圾收集器在一个 Java 程序中的执 行是自动的,不能强制执行,即使程序员能明确地判断出有...
  • bao19901210
  • bao19901210
  • 2014年09月16日 16:52
  • 7709
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于JAVA垃圾收集器与类的finalize()方法的一些总结
举报原因:
原因补充:

(最多只允许输入30个字)