前言:
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!