连接:https://www.nowcoder.com/questionTerminal/d8eab06913084e42b515633604eef7cd?pos=28&mutiTagIds=570&orderByHotValue=0&done=0
来源:牛客网
函数
参考:《深刻理解Java虚拟机》
对于Java而言:
调用时机:当垃圾回收器要宣告一个对象死亡时,至少要通过两次标记过程:若是对象在进行可达性分析后发现没有和GC Roots相链接的引用链,就会被第一次标记,而且判断是否执行finalizer( )方法,若是对象覆盖finalizer( )方法且未被虚拟机调用过,那么这个对象会被放置在F-Queue队列中,并在稍后由一个虚拟机自动创建的低优先级的Finalizer线程区执行触发finalizer( )方法,但不承诺等待其运行结束。
finalization的目的:对象逃脱死亡的最后一次机会。(只要从新与引用链上的任何一个对象创建关联便可。)可是不建议使用,运行代价高昂,不肯定性大,且没法保证各个对象的调用顺序。可用try-finally或其余替代。
1)垃圾回收器(garbage collector)决定回收某对象时,就会运行该对象的finalize()方法; 2)GC原本就是内存回收了,应用还须要在finalization作什么呢? 答案是大部分时候,什么都不用作(也就是不须要重载)。只有在某些很特殊的状况下,好比你调用了一些native的方法(通常是C写的),能够要在finaliztion里去调用C的释放函数。