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 }

    

原文地址:https://www.cnblogs.com/xuxu8511/p/2517889.html