java finalize()方法

前言:

java同其他语言一样,也需要对内存进行清理,但不同之处在于,java自身有着垃圾回收器,负责回收无用对象占据的内存资源。但也存在一些特殊的情况,因为不是通过new产生的一些特殊对象,垃圾回收器则无能无力,而finalize()方法则可以定义对这些对象的处理。

 

概念:

定义在Object类中:

protected void finalize() throws Throwable { }

 

finalize()方法是Object类的protected方法,但是并没有做任何事情,子类可以override。当垃圾回收器要回收对象时(如果没有override该方法,则垃圾回收是直接回收),会首先调用finalize()方法,并放入F-Queue,由一个低优先级的线程(finalize()可能会带来性能问题)在下一次GC进行回收。并且finalize()方法只会调用一次(假如最后重生后,以后再也不会被回收)。

 

程序中直接调用finalize()并不进行回收,只是一个普通的方法。

 

对象:

对象所处的状态:

        unfinalized 未执行finalize

        finalizable 可执行finalize

        finalized 已经执行finalize

对象是否可达:

        reachable 

        finalizer-reachable 

        unreachable 

当对象处于unreachable+finalized或者unreachable+unfinalized(未覆盖finalized()方法),将被回收。

 

何时调用:

1.垃圾回收器进行回收时。

2.程序退出时。

3.直接调用System.gc().

但是垃圾回收器何时工作,即使显示调用也不能保证一定执行,即使执行也不一定执行finalize()方法(重生的不会再执行),而finalize()方法更不能保证能完全执行完。所以说finalize()的方法具有不确定性。

 

何时能用到:

1.调用了本地方法(通过JNI创建的对象)

2.处理非内存资源(处理文件、端口处理)

但是跟上面的一样,并不能保证能够完全执行成功。

 

说了这么多,总的来说,貌似finalize()方法并没有太大的作用,不能指望finalize(),所以必须创建其他的clean方法并且明确的调用来进行资源分配。在java 9中已经明确将Object.finalize()标记为Deprecated!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值