java垃圾回收机制-垃圾回收机制的特色和特色分析
1.什么是“垃圾回收”机制?java
当程序建立对象,数组等引用类型实体时,系统会在堆内存中为之分配一块内存区,对象就保存在内存区中,当内存再也不被任何引用变量引用时,这块内存就变成了垃圾,等待垃圾回收机制去进行回收。数组
2.垃圾回收机制的特色:网络
*垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(网络io等)ide
*程序没法精准控制垃圾回收的运行,垃圾回收在合适的时候进行,当对象永久性失去了引用后。系统会在合适的时候回收它所占的内存测试
*在垃圾回收机制回收任何对象以前,总会调用它的finalize()方法,该方法可能使该对象从新复活(使用一个引用变量从新去引用该对象),从而致使垃圾回收机制取消回收this
3.对象在内存中的状态?指针
*可达状态:当一个对象建立后,若是有一个以上的引用变量去引用它,则处于可达状态code
*可恢复状态:若是程序中的某个对象再也不有任何引用变量去引用它,它就进入了可恢复状态java垃圾回收机制,在这种状态下,系统的垃圾回收机制准备回收该对象所占用的内存,在回收该对象前,系统会调用它的finalize()方法实现资源清理,若是这时有引用变量进行引用时该对象,则该对象会再次变为可达状态,不然会变为不可达状态对象
*不可达状态:当对象和全部引用变量的关联都被切断,且系统已经调用全部对象的finalize()后,对象依然没有达到可达状态,则该对象永久性失去引用,最后达到不可达状态,系统回收该对象所占有的全部资源blog
4.强制垃圾回收
当对象失去引用后,程序不知晓何时进行资源清理,垃圾回收,程序只能控制对象什么时候再也不被任何引用变量引用,毫不能控制对象什么时候被回收
程序没法控制java垃圾回收的时机,可是能够通知系统进行垃圾回收(强制垃圾回收),可是只是通知,系统是否垃圾回收仍是不肯定。大部分时候,程序强制系统回收后总会有一些效果
强制回收方法
*System.gc()
*Runtime.getRuntime().gc()
什么是finalize方法?
1.在垃圾回收机制回收某个对象占用的资源以前,一般要求程序调用适当的方法来进行资源的清理,在java中提供了默认的机制来进行资源的清理(finalize()方法)
原型:protected void finalize() throws Throwable
特色:
*不要主动去调用finalize()方法,由垃圾回收机制调用
*该方法的调用具备随机性
*在调用该方法的时候,可能使该对象或者系统中的对象从新变成可达状态(有其余对象引用)
*当JVM执行finalize方法出现异常时,垃圾回收机制不会报告异常,程序会进行执行
*若是想人为去清理某个类的资源时java垃圾回收机制,因为finalize方法具备随机性,所以不要采用该方法
举个栗子:
public class FinalizeDemo { private static FinalizeDemo fd=null; public void info(){ System.out.println("测试资源调度的Finalize方法"); } public static void main(String[]args) throws Exception{ new FinalizeDemo();//建立新的对象 //通知系统进行资源清理 System.gc(); //让系统执行finalize方法 强制回收 Runtime.getRuntime().runFinalization(); System.runFinalization(); fd.info(); } //重写该方法 @Override public void finalize(){ //使对象从新变成可达状态 fd=this; } }
*使用system.gc()能够提醒系统去清空资源 若是调用取消强制垃圾回收,会出现空指针异常(由于程序没有通知系统进行垃圾回收,内存也不紧张,因此不会调用finalize方法,fd变量依旧为null。出现空指针异常)