java基础:简述垃圾回收机制 - Go语言中文社区

java基础:简述垃圾回收机制


1.什么是“垃圾回收”机制?

当程序创建对象,数组等引用类型实体时,系统会在堆内存中为之分配一块内存区,对象就保存在内存区中,当内存不再被任何引用变量引用时,这块内存就变成了垃圾,等待垃圾回收机制去进行回收。

2.垃圾回收机制的特点:

*垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(网络io等)

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

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

3.对象在内存中的状态?

*可达状态:当一个对象创建后,如果有一个以上的引用变量去引用它,则处于可达状态

*可恢复状态:如果程序中的某个对象不再有任何引用变量去引用它,它就进入了可恢复状态,在这种状态下,系统的垃圾回收机制准备回收该对象所占用的内存,在回收该对象前,系统会调用它的finalize()方法实现资源清理,如果这时有引用变量进行引用时该对象,则该对象会再次变为可达状态,否则会变为不可达状态

*不可达状态:当对象和所有引用变量的关联都被切断,且系统已经调用所有对象的finalize()后,对象依然没有达到可达状态,则该对象永久性失去引用,最后达到不可达状态,系统回收该对象所占有的所有资源

 

4.强制垃圾回收

当对象失去引用后,程序不知晓什么时候进行资源清理,垃圾回收,程序只能控制对象何时不再被任何引用变量引用,绝不能控制对象何时被回收

程序无法控制java垃圾回收的时机,但是可以通知系统进行垃圾回收(强制垃圾回收),但是只是通知,系统是否垃圾回收还是不确定。大部分时候,程序强制系统回收后总会有一些效果

强制回收方法

*System.gc()

*Runtime.getRuntime().gc()

 

什么是finalize方法?

1.在垃圾回收机制回收某个对象占用的资源之前,通常要求程序调用适当的方法来进行资源的清理,在java中提供了默认的机制来进行资源的清理(finalize()方法)

原型:protected void finalize() throws Throwable

特点:

*不要主动去调用finalize()方法,由垃圾回收机制调用

*该方法的调用具有随机性

*在调用该方法的时候,可能使该对象或者系统中的对象重新变成可达状态(有其他对象引用)

*当JVM执行finalize方法出现异常时,垃圾回收机制不会报告异常,程序会进行执行

*如果想人为去清理某个类的资源时,由于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。出现空指针异常)

 

 

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Lzinner/article/details/89086312
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 18:46:26
  • 阅读 ( 905 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢