黑马程序员技术交流社区

标题: 垃圾回收机制 [打印本页]

作者: scott0610    时间: 2013-3-10 09:29
标题: 垃圾回收机制
本帖最后由 袁见 于 2013-3-10 09:32 编辑

最近发现很多同学都问过关于垃圾回收机制的问题。下面根据个人的理解和查阅相关资料,进行了一下总结,希望对同学们有所帮助。
尤其以后想做Android软件开发的同学,一定要掌握java的垃圾回收机制,硬件资源移动设备不能和PC机相比。
垃圾回收:当程序创建对象,数组等应用类型实体时,系统都会在堆内存中为之分配一块内存空间,对象就保存在这块内存空间里,当这块内存不再被任何引用变量引用时,这块内存空间就变成了垃圾,等待垃圾回收机制进行回收。
特点:
(1)垃圾回收机制只负责回收堆内存中对象,不会回收任何物理资源(比如数据库连接,网络IO等资源)
(2)程序无法精确控制垃圾回收的运行,垃圾回收会在合适的时候运行。当对象永久性地失去引用后,系统就会在适合的时候回收它所占的内存。
(3)垃圾回收机制回收任何对象之前,总会先调用它的finalize方法,该方法可能使该对象重新复活(让一个引用变量重新引用该对象),从而导致垃圾回收机制取消回收。
当一个对象在堆内存中运行时,可以将对象所处的状态分为一下三种:
(1)激活状态:当一个对象被创建后,有一个以上的引用变量引用它,则这个对象在程序中处于激活状态,程序可以通过引用变量来调用该对象的属性和方法。
(2)去活状态:如果程序中某个对象不再被任何引用变量引用它,它就进入了去活状态。在这个状态下,系统的垃圾回收机制准备回收该对象所占的内存,回收之前,系统会调用去活状态对象的finalize方法进行资源清理,如果系统在调用finalize方法重新让一个引用变量引用该对象,则这个对象会再次变为激活状态,否则该对象将进入死亡状态。
(3)当对象与所有引用的关联都被切断,其系统已经调用所有对象的finalize方法依然没有使该对象变为激活状态,这个对象将永久的失去引用,最后变为死亡状态,只有当对象处于死亡状态时,系统才会真正回收该对象所占的资源。

强制垃圾回收:
程序是无法精确控制Java垃圾回收的时间,但我们依然可以强制系统进行垃圾回收:只是这种强制只是通知系统进行垃圾回收,但系统是否进行垃圾回收这个还是不确定。当使用强制系统垃圾回收后还是会有一点效果的。
强制垃圾回收:
(1)调用System类的gc()静态方法:System.gc();
(2)调用Runtime对象的gc()实例方法:Runtime.getRuntime().gc();
经典实例:
public class Test {      
  public static void main(String[] args) {
                for(int i=0;i<3;i++){
                  new Test();                     
                  //下面两行diamond的作用完全相同,强制系统进行垃圾回收      
                  //Runtime.getRuntime().gc();                  
                  System.gc();        
            }   
  }      
  public void finalize(){            
     System.out.println("系统正在处理Test兑现的的资源...");   
   }
}
注意:强制垃圾回收仅仅只是建议系统立即进行垃圾回收,系统完全有可能并不立即进行垃圾回收,只是通知垃圾回收机制,让其尽快的进行垃圾回收。

作者: 马甲大王    时间: 2013-3-10 09:40
写的很详细,看看温习下,加油啊。
作者: 李晓峰    时间: 2013-3-19 16:16
谢谢!!!{:soso_e100:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2