Java 垃圾回收机制

来源:互联网 发布:刚性攻丝编程 编辑:程序博客网 时间:2024/06/05 19:53

------- android培训、java培训、期待与您交流! ----------

Java的垃圾回收是Java语言的重要功能之一。当程序创建对象,数组等引用类型实体时,系统都会在堆内存中分配一块内存区,当这块内存不再被任何引用变量引用时,这块内存就编程了垃圾,等待垃圾回收机制进行回收。

垃圾回收机制具有的特征:

1,垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(数据库链接等);

2,程序无法控制垃圾回收的精确运行,垃圾回收会在适当的时候进行,当对象永久性的失去引用后,系统就会在合适的时候收回它所占用的内存。

3,在垃圾回收机制回收任何对象之前,总会先调用它的finalize()方法,使该对象重新复活(让一个引用变量重新指向该对象),从而导致垃圾回收机制取消回收。

当一个对象在堆内存中运行时,根据它被引用变量所引用的状态分为三种情况:

可达状态:当创建一个对象后,有一个或以上的引用变量指向该对象,则这个对象为可达状态;

可恢复状态:当一个对象不再被任何引用变量指向时,该对象为可恢复状态。

不可达状态:当一个对象与所有的引用变量的关联都被切断时,并且系统已经调用了对象的finalize()方法后依然没有让该对象变成可达状态,那么这个对象将永久的失去引用,变成不可达状态。只有处在这个状态的时,系统才会收回该对象所占用的空间。

虽然我们无法控制垃圾回收机制的精确运行。但是我们可以强制系统进行垃圾回收。注意:这里的强制系统进行垃圾回收,只不过是通知系统进行垃圾回收。但系统是否进行垃圾回收依然不确定。

大部分时候强制系统垃圾回收后总会有一些效果。

强制系统垃圾回收的方法有两种:

第一种:System.gc();第二种:Runtime.getRunTime().gc();

例如:

我在运行后:第一次没有任何输出,第二次也没有,第三次输出了finalize()方法中的内容,正好说明了,即使强制让系统进行垃圾回收,但是具体何时回收也是不确定的。


下面的例子是在强制让系统进行垃圾回收时,系统调用finalize()方法后,使该对象重新变成可达状态。


运行结果:


但是要明确即使让主线程暂停三秒也不一定能让系统进行垃圾回收。但暂停后再通知系统进行垃圾回收后,系统进行垃圾回收的可能性会变大。


0 0