fianlize()函数讨论
都知道java中的类都是从Object类继承过来的。而,Object类存在fianlize函数,那么该函数的作用是什么呢?
和c++中的析构函数有点像,都是对象内存释放的时候调用。
区别:
1、在内存释放的时候调用finalize函数,对象可能不被垃圾回收。
2、垃圾回收并不等于“析构”。
3、垃圾回收只与内存有关。
finalize函数的工作原理:在垃圾回收器(JVM中)准备好释放对象内存时,首先调用finalize函数,并且在下一次垃圾回收时才会真正回收对象内存。所以,可以在finalize函数做一些清理工作。这些必须手动添加代码实现。
专家建议,一般不要用finalize函数来做清理工作。原因,JVM自动的调用finalize函数,程序员无法控制程序什么时候调用finalize函数。但是,java给我们提供了显示的调用System.gc()来执行finalize函数。
以下给出发生finalize调用的情况分析:【重点】
a、当一个对象的内存不再使用时;(需要显示的调用System.gc();)
1、如,obj =null;
2、Book book = new Book(); // 这里申请的内存块,没有引用对象,也就是不会再用到了。会发生finalize函数调用。
bo0k = new Book();
3、new Book(); // 匿名对象,本次用完后,其内存块没有了引用对象,内存不再使用。会发生finalize函数调用。
b、程序导致系统内存不够时;(不需要显示的调用System.gc();)
如:
for(int i =0;i<100000000;i++)
Book book = new Book();
——————————————————————————————————————————————————————————
全文程序代码:
1 class Tank{ 2 boolean zt = true; // true is man, false is kong. 3 public void zh(){ 4 zt = false; 5 } 6 protected void finalize(){ 7 if(!zt) 8 { 9 System.out.println("空的"); 10 } 11 else { 12 System.out.println("满的,已置空"); 13 zt = false; 14 } 15 } 16 } 17 public class Test { 18 19 public static void main(String[] args){ 20 21 for(int i =0;i<1000000;i++) { 22 Tank tank = new Tank(); 23 } 24 } 25 }