本帖最后由 袁见 于 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兑现的的资源...");
}
}
注意:强制垃圾回收仅仅只是建议系统立即进行垃圾回收,系统完全有可能并不立即进行垃圾回收,只是通知垃圾回收机制,让其尽快的进行垃圾回收。
|