`
liuxinglanyue
  • 浏览: 545828 次
  • 性别: 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()的用法。

    Java中finalize方法使用.doc

    Java中finalize方法使用

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

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

    Java中finalize方法.pdf

    Java中finalize方法.pdf 学习资料 复习资料 教学资源

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

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

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

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

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

    主要介绍了Java垃圾回收机制的finalize方法,结合实例形式分析了finalize方法的特点及在垃圾回收机制中的相关操作技巧,需要的朋友可以参考下

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

    主要介绍了详解Java编程中final,finalize,finally的区别,这个在Java面试题中简直是太常见了...需要的朋友可以参考下

    Java常见面试题208道.docx

    面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...

    final、fianlly、finalize区别

    Java 技术允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去 之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对 象调用的。它是在Object 类中定义的,因此所有的类都...

    Java禁止使用finalize方法

    主要介绍了Java禁止使用finalize方法,需要的朋友可以参考下

    java大厂面经、直击BAT

    ## 二.finally finally 一定会被执行,如果 finally ...finalize()方法是Object类的一个protected方法,它是在对象被垃圾回收之前由Java虚拟机来调用的。 ## 四. finally到底是在return之前执行还是return之后执行?

    Java中final,finally,finalize三个关键字的区别_动力节点Java学院整理

    Java中final,finally,finalize三个关键字的区别_动力节点Java学院整理

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

    主要介绍了Java中覆盖finalize()方法实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

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

    主要介绍了简单理解Java的垃圾回收机制与finalize方法的作用,着重讲解了Java的GC销毁对象的过程,需要的朋友可以参考下

    史上最全java面试,103项重点知识,带目录

    75. final、finally、finalize 有什么区别? 35 76. try-catch-finally 中哪个部分可以省略? 35 77. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗? 36 78. 常见的异常类有哪些? 38 八、...

    Java面试题.docx

    14、Java中实现多态的机制是什么? 16、说说你对Java反射的理解 17、说说你对Java注解的理解 18、Java中String的了解 19、String为什么要设计成不可变的? 20、Object类的equal和hashCode方法重写,为什么? ...

    JAVA面试经典试题

    Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承...

    霸屏天下源码java-java-notes:笔记

    霸屏天下源码java 面试的 Java 修订版 参考资料 Java - 完整参考 [第 9 版] 计划 - 涵盖以下主题 简单的话题 Java 流行语 :check_mark_button: 面向对象的三个原则 :check_mark_button: 遗产 封装 多态性 抽象 java...

    Java面试宝典2020修订版V1.0.1.doc

    12、什么时候用JDBC什么时候用Hibernete; 91 13、hibernate 数据的三个状态 91 14、Hibernate中load和get的区别? 92 15、Hibernate的工作原理? 92 16、hibernate优缺点? 92 17、Hibernate是如何延迟加载的? 93 ...

Global site tag (gtag.js) - Google Analytics