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。出现空指针异常)

 

 

 

  • 19
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值