Java中的内存回收都是通过gc回收器进行回收,但是gc是认识已Java形式分配的对象空间(比如new),如果使用一些特殊的方式分配的空间,一般这种情况主要发生在使用“本地方法”的情况下,“本地方法”是一种在 Java中调用非Java代码的方式,已调用非Java代码分配内存的方式,gc是无法进行回收,所以就产生了finalize()方法。
finalize()是gc回收器在回收一个对象时第一个调用的方法,所以就允许我们在对象回收之前先完成对特殊内内存的清理,但只有到下一次垃圾回收过程中,才会真正的回收对象空间。
finalize()在什么时候被调用? 有三种情况 1.所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候. 2.程序退出时为每个对象调用一次finalize方法。 3.显式的调用finalize方法 4.当某个对象被系统收集为无用信息的时候,finalize()将被自动调用
但是jvm并不保证finalize()一定会被调用,也就是说finalize的调用是不确定的。
注意三点 1、对象可能不被gc回收 2、垃圾回收并不等于“析构” 3、垃圾回收只与内存有关
Java并不能保证对象会被及时的回收,JVM并未面临内存耗尽的情形,它是不会浪费时间去执行垃圾回收以恢复内存。