`
liuxinglanyue
  • 浏览: 562742 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java牛角尖【005】:finalize方法什么时间执行?

阅读更多

与C++不同,Java有自己的垃圾回收机制,同时,Java没有了析构函数的概念,转而提供了一个finalize方法,那么finalize方法会在什么时间执行呢? 
  或许有人以为是在将引用设置为null的时候,现在先看下面的例子: 

1.

Java代码 
  1. public class Test {    
  2. 2.      public static void main(String[] args) {    
  3. 3.          // TODO Auto-generated method stub    
  4. 4.          Demo d = new Demo();    
  5. 5.          System.out.println("begin to set d to null");    
  6. 6.          d = null;    
  7. 7.          System.out.println("d was set to null");    
  8. 8.      }    
  9. 9.  }    
  10. 10.     
  11. 11class Demo {    
  12. 12.     @Override    
  13. 13.     protected void finalize() throws Throwable {    
  14. 14.         // TODO Auto-generated method stub    
  15. 15.         System.out.println("Demo finalized");    
  16. 16.         super.finalize();    
  17. 17.     }    
  18. 18. }    

  运行一下代码,结果如下: 
Java代码 
  1. 1.  begin to set d to null    
  2. 2.  d was set to null    

  finalize方法根本没有被执行,看一下java中对finalize方法的定义:Called by the garbage collector on an object when garbage collection determines that there are no more references to the object. 当垃圾回收确认没有指向对象的引用时,执行回收。而上面的代码新建的对象Demo的唯一引用d已经被释放,而确有执行Demo类的finalize方法,唯一的原因只能是gc并没有执行,gc只有在JVM内存不足的时候才会自动执行,为了测试,我们将代码作一下修改: 
Java代码 
  1. 1.  public class Test {    
  2. 2.      public static void main(String[] args) {    
  3. 3.          // TODO Auto-generated method stub    
  4. 4.          Demo d = new Demo();    
  5. 5.          System.out.println("begin to set d to null");    
  6. 6.          d = null;    
  7. 7.          System.out.println("d was set to null");    
  8. 8.          System.out.println("begin run gc");    
  9. 9.          System.gc();    
  10. 10.         System.out.println("gc runed");    
  11. 11.     }    
  12. 12. }    
  13. 13.     
  14. 14class Demo {    
  15. 15.     @Override    
  16. 16.     protected void finalize() throws Throwable {    
  17. 17.         // TODO Auto-generated method stub    
  18. 18.         System.out.println("Demo finalized");    
  19. 19.         super.finalize();    
  20. 20.     }    
  21. 21. }    

运行结果如下: 
Java代码 
  1. 1.  begin to set d to null    
  2. 2.  d was set to null    
  3. 3.  begin run gc    
  4. 4.  gc runed    
  5. 5.  Demo finalized    

  所以finalize方法只有在JVM执行gc时才会被执行,所以我们在写代码用到的时候需注意,这里面的代码不知道什么时候才会去执行,所以要尽量少用。 

分享到:
评论

相关推荐

    Java中finalize()的用法

    在 Java 中,finalize() 方法是 Object 类的一个方法,默认情况下,纯 Java 编写的 Class 不需要重新覆盖这个方法。只有在特殊情况下,例如使用 JNI 或 C++ 编写的 Class 时,需要覆盖默认的 finalize() 方法,以...

    Java中finalize方法使用.doc

    另外,finalize 方法的执行时间也是不确定的,因为垃圾回收器的回收时间是不可预测的。因此,在实际开发中,应该尽量避免使用 finalize 方法,而应该使用其他方法来释放资源。 finalize 方法是一个非常重要的方法,...

    Java禁止使用finalize方法共2页.pdf.zip

    在Java编程语言中,`finalize()`方法是一个特殊的方法,它属于`Object`类,主要用于对象销毁前执行一些必要的清理工作。然而,随着Java版本的更新和垃圾收集机制的改进,`finalize()`方法逐渐失去了其原本的重要性,...

    Java中finalize方法.pdf

    Java中的`finalize()`方法是Java语言提供的一种机制,用于在对象被垃圾回收之前进行资源清理。这个方法在Java的`Object`类中被定义为`protected`类型,因此所有Java类都能够覆盖它来实现特定的清理操作。在垃圾回收...

    Java垃圾回收机制的finalize方法实例分析

    Java垃圾回收机制的finalize方法实例分析 Java垃圾回收机制的finalize方法是垃圾回收机制中一个非常重要的概念,它可以帮助开发者更好地理解和掌握垃圾回收机制的工作机理。本文将通过实例形式分析finalize方法的...

    Java面试题及答案-java面试题

    Java 中的 final、finally 和 finalize 关键字有什么区别? final:当用“final”关键字声明一个变量时,它的值一旦被赋值就不能改变。当使用“final”关键字声明方法时,它不能在子类中被覆盖。当用“final”...

    Java禁止使用finalize方法

    垃圾回收器在什么时候调用finalize方法是不知道的,它可能是在对象被垃圾回收时,也可能是在JVM退出时。这种不确定性会导致资源浪费和泄露的风险。 其次,finalize方法可能不被调用。在某些情况下,finalize方法...

    Java中finalize()详解及用法

    * 执行清理操作:finalize()方法可以用来执行清理操作,例如删除临时文件等。 例如,在下面的代码中,我们定义了一个finalize()方法: ```java public class FinalTest { @Override protected void finalize() ...

    Java中覆盖finalize()方法实例代码

    finalize()方法是Java中的一个特殊方法,它可以在对象被垃圾回收器回收之前执行一次。这个方法可以用来释放对象持有的资源,但是它的使用需要非常小心,因为它带有很多不确定性。 在Java中,finalize()方法是Object...

    java面试题 谈谈final, finally, finalize的区别

    在Java编程语言中,`final`, `finally`, 和 `finalize` 是三个非常重要的关键字,它们各自扮演着不同的角色,尤其在处理程序的可预测性、数据的不可变性和垃圾回收等方面。下面将详细阐述这三个关键字的区别及其应用...

    详解Java编程中final,finalize,finally的区别

    Java编程中的`final`, `finalize`, 和`finally`是三个重要的关键字,它们各自在不同的场景下发挥着关键作用。理解这三个关键字的区别对于Java开发者来说至关重要,尤其是在面试中常常会被问及。 首先,`final`是一...

    Java中针对finalize的实现和相应的执行过程

     这个引用对象专门为带finalize方法的类服务,可以理解为每一个有相应的方法的对象,其都会封装为一种finalRefernece对象.  因为finalize方法是object定义的,其默认实现为空.那么如果重写了此方法,那么方法体...

    java 线程池管理类:Executors_.docx

    这个线程池以无界队列的方式运行,确保任务按顺序执行,并且任何时候只有一个线程是活动的。 - 返回值:一个新的`ExecutorService`对象。 - 特点: - 如果在关闭前因执行失败导致单个线程终止,将有一个新线程...

    Java9垃圾回收方法finalize() 原理解析

    但是,这种方法存在一些问题,例如finalize()方法可能不会被执行,或者执行时间具有不确定性。 在JDK9中,我们可以使用Cleaner类来代替finalize()方法。Cleaner类提供了一个更安全、更可靠的方式来释放对象占用的...

    详解java中finalize的实现与相应的执行过程

    Java中的`finalize`方法是Object类的一个特殊方法,它的主要作用是在对象被垃圾收集器回收前执行清理工作。本文将详细解析`finalize`方法的实现和执行过程。 首先,了解`finalize`方法的用途:当一个对象不再被任何...

    简单理解Java的垃圾回收机制与finalize方法的作用

    Java中的`finalize()`方法是对象生命周期的一部分,它与C++中的析构函数类似,但在功能和调用时机上有所不同。`finalize()`方法是在对象被GC标记为可回收并准备释放之前调用的,提供了在对象被彻底删除前执行某些...

    final, finally, finalize的区别

    2. **效率低下**:`finalize` 方法的执行可能会延迟 GC 的完成时间,从而降低程序的运行效率。 3. **替代方案**:现代 Java 编程倾向于使用更可靠的资源管理技术,如 try-with-resources 语句或显式资源管理,而非...

    200个Java经典面试题总结附带答案.docx

    Java经典面试题总结附带答案 以下是从给定文件中生成的相关知识点: Java基础 1. JDK 和 JRE 的区别是什么?(JDK 是 Java Development Kit,JRE 是 Java Runtime Environment) 2. `==` 和 `equals` 的区别是...

Global site tag (gtag.js) - Google Analytics