finalize

机制: 自动释放不再使用的资源,垃圾回收释放的是对象使用的内存资源,不过对象可能会保存其他类型资源,如打开文件网络连接,垃圾回收期不会释放额外资源,因此,终极机制作用让开发者执行清理任务,如关闭文件,中断网络连接,删除临时文件,等等。

使用步骤:

                  如果可终结的对象不可达,会再内部终结队列存放一个引用,指向这个对象;而且,为了回收垃圾,这个对象呗标记为存活。

                  对象一个接着一个从终结队列移除,然后调用各自的finalize()方法。

                  调动终结方法后,不会立即释放对象,因为终结方法肯恩会把this,引用存储在某个地方(如某个类的公开静态字段中)

,让对象再次拥有引用,复活对象。

                  因此,调用finalize()后,垃圾回收子系统在回收对象前,必须重新判断对象是否可达。

                 不过,对象就算复活了,也不会再次调用终结方法。

                定义finalize()方法的对象一般会多存活一个GC循环(如果生命周期长,会再多存活一个完整的GC循环)

场景:

                 在一个类中使用本地方法,打开某个非Java资源。就算遇到这种情况,也更适合使用处理资源的块状try语句,但也可以声明一个public native finalize()方法 (close()方法会调用这个方法)-------这个方法可以释放本地资源,包括不受Java垃圾回收程序控制的堆外内存。

细节:

        在没有回收全部重要对象前,JVM可能就会推出,所以不会调用终结方法。

        确保虚拟机退出前执行某些操作,可以使用Runtime.getRuntime().addShutDownHook钩子,在JVM退出前安全执行任意代码。
        finalize()是实例方法,没有等效的机制用来终结类方法。

       每个类只有一个finalize()方法。

       终结方法可以抛出任何类型的异常或错误,但垃圾回收子系统自动调用终结方法时,终结方法抛出的任何异常

     或错误都会被忽略,这些异常或错误只会导致错误方法返回。

         

  Runtime.getRuntime().addShutdownHook(new Thread(){
             @Override
             public void run() {
                 System.out.println("addShutdownHook !");
             }
         });

        System.out.println("main is over!");

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值