1、java gc要回收对象的时候,首先要调用这个类的finalize方法,但是并不是调用这个finalize方法就等同于垃圾回收,只是在gc之前 finalize 方法会被调用,所以基本可以说其被回收了。
2、但由于gc的自动回收机制,并不能保证 finalize 方法会被及时地执行(垃圾对象的回收时机具有不确定性),也不能保证它们会被执行(程序由始至终都未触发垃圾回收)。
3、提供这样的机制的原因在于:让我们有时想在撤消一个对象时完成一些操作(有点像生命周期钩子),比如一些Java以外的代码编写的Class(比如JNI-Java Native Interface,C语言malloc()分配的内存),垃圾回收器并不能对这些部分进行正确的回收,进而在 finalize 方法中另外干预(那这些Class要怎么用java代码释放呢?让Java代码去运行个shell脚本?);或者释放非Java 资源(如打开的文件资源、数据库连接等)。
4、如果在 finalize 中重新让对象不符合gc条件,这样对象就避开了一次gc,但下次对象再次符合条件的时候 finalize 不会被调用,因为 finalize 只能被调用一次(why)
5、最后:它什么时候会被调用
- 所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候。
- 程序退出时为每个对象调用一次finalize方法。
- 显式的调用finalize方法。(那这样算被调用一次吗?)
再补充吧……
参考:https://blog.csdn.net/crazylai1996/article/details/84900818