Java中的finalize方法

转载自:Java中的finalize()方法
  

Java中假定finalize的工作原理为:
  一旦垃圾回收器准备回收内存而释放对象所占内存的时候,会先调用该对象的finalize方法,然后在下一次再需要垃圾回收的时候才真正的回收对象!

finalize()的作用:
  finalize用于在GC发生前事先调用去回收JNI调用中申请的特殊内存,下次GC发生时候保证GC后所有该对象的内存都释放了。   

垃圾回收

  • Java的垃圾回收器只会释放由我们new出来的内存堆块,那些不是由new出来的“特殊内存”,垃圾回收器是不会管理的。

  • 所谓的特殊内存指通过JNI用C/C++向系统申请的内存,这些内存如果不手动去清除就会一直占据在内存中。

  • 而且,垃圾回收本身就有开销,所以虚拟机不会经常GC,只有当内存快要耗尽的时候JVM才会触发GC。

finalize()

  • 由上,Java中的对象并不一定会被全部垃圾回收,当你不想要该对象的时候,你需要手动去处理那些“特殊内存”,java中没有析构,所以提供了一个finalize()方法让我们来执行清理工作。

  • 当系统进行GC的时候会先调用finalize方法,然后再下次才会回收对象的内存。因为native中申请的内存,GC没有办法回收所以finalize被用来做垃圾回前的重要清理工作:释放特殊内存。

  • 所以finalize一般使用在使用了JNI的情景下,需要在finalize中调用native方法释放特殊内存,一般情况下不要使用finalize!

  • 如果GC不发生那么finalize也不会发生,finalize是Object的protect方法,不可以在类族外访问。

不是析构函数

  • Java因为有GC机制,所以没有析构函数的概念!

  • finalize不是C++中的析构函数:析构函数肯定是会销毁该对象的,但是finalize因为gc机制不会经常发生,所以其被执行的是不确定的。(不知道是不是我没理解透,没觉得这两个有什么可比性,一个主动发生一个被动发生)

其他

  • 调用System.gc(),可以强制让gc发生来触发finalize方法!但是GC也只是GC垃圾的对象(没有被引用的),非垃圾的对象的finalize不会被调用。程序终止和GC不是一个概念。

  • 正常情况下你调用finalize()都是直接super.finalize()使用父类的就行了。

  • finalize一般不用!被执行的不确定性太大。不要指望使用finalize来回收你的对象,它只会在系统进行GC的时候清理特殊内存,不受你的控制!

---------------- The End ----------------
0%