一、finalize 的作用

1、finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。
    2、finalize()与C++中的析构函数不是对应的。C++中的析构函数调用的时机是确定的(对象离开作用域或delete掉),但Java中的finalize的调用具有不确定性。
    3、不建议用finalize方法完成“非内存资源”的清理工作,但建议用于:① 清理本地对象(通过JNI创建的对象);② 作为确保某些非内存资源(如Socket、文件等)释放的一个补充:在finalize方法中显式调用其他资源释放方法。

二、finalize 的问题

1、一些与finalize相关的方法,由于一些致命的缺陷,已经被废弃了,如System.runFinalizersOnExit()方法、Runtime.runFinalizersOnExit()方法。
    2、System.gc()与System.runFinalization()方法增加了finalize方法执行的机会,但不可盲目依赖它们3、
    3、Java语言规范并不保证finalize方法会被及时地执行、而且根本不会保证它们会被执行
    4、finalize方法可能会带来性能问题。因为JVM通常在单独的低优先级线程中完成finalize的执行
    5、对象再生问题:finalize方法中,可将待回收对象赋值给GC Roots可达的对象引用,从而达到对象再生的目的

6、finalize方法至多由GC执行一次(用户当然可以手动调用对象的finalize方法,但并不影响GC对finalize的行为)

三. finalize的执行过程(生命周期)

1、 首先,大致描述一下finalize流程:当对象变成(GC Roots)不可达时,GC会判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。否则,若对象未执行过finalize方法,将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize方法。执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。
    2、 具体的finalize流程:
对象可由两种状态,涉及到两类状态空间,一是终结状态空间 F = {unfinalized, finalizable, finalized};二是可达状态空间 R = {reachable, finalizer-reachable, unreachable}。各状态含义如下:
unfinalized: 新建对象会先进入此状态,GC并未准备执行其finalize方法,因为该对象是可达的
finalizable: 表示GC可对该对象执行finalize方法,GC已检测到该对象不可达。正如前面所述,GC通过F-Queue队列和一专用线程完成finalize的执行
finalized: 表示GC已经对该对象执行过finalize方法
reachable: 表示GC Roots引用可达
finalizer-reachable(f-reachable):表示不是reachable,但可通过某个finalizable对象可达
unreachable:对象不可通过上面两种途径可达

变迁说明:
    1、新建对象首先处于[reachable, unfinalized]状态(A)
   2、随着程序的运行,一些引用关系会消失,导致状态变迁,从reachable状态变迁到f-reachable(B, C, D)或    unreachable(E, F)状态
    3、若JVM检测到处于unfinalized状态的对象变成f-reachable或unreachable,JVM会将其标记为finalizable状态(G,H)。若对象原处于[unreachable, unfinalized]状态,则同时将其标记为f-reachable(H)。
    4、在某个时刻,JVM取出某个finalizable对象,将其标记为finalized并在某个线程中执行其finalize方法。由于是在活动线程中引用了该对象,该对象将变迁到(reachable, finalized)状态(K或J)。该动作将影响某些其他对象从f-reachable状态重新回到reachable状态(L, M, N)
    5、处于finalizable状态的对象不能同时是unreahable的,由第4点可知,将对象finalizable对象标记为finalized时会由某个线程执行该对象的finalize方法,致使其变成reachable。这也是图中只有八个状态点的原因
    6、程序员手动调用finalize方法并不会影响到上述内部标记的变化,因此JVM只会至多调用finalize一次,即使该对象“复活”也是如此。程序员手动调用多少次不影响JVM的行为
    7、若JVM检测到finalized状态的对象变成unreachable,回收其内存(I)
    8、若对象并未覆盖finalize方法,JVM会进行优化,直接回收对象(O)
    9、注:System.runFinalizersOnExit()等方法可以使对象即使处于reachable状态,JVM仍对其执行finalize方法

四. 代码示例

public class GC {         public static GC SAVE_HOOK = null;         public static void main(String[] args) throws InterruptedException {          SAVE_HOOK =  new GC();          SAVE_HOOK =  null;          System.gc();          Thread.sleep( 500);           if (null != SAVE_HOOK) { //此时对象应该处于(reachable, finalized)状态              System.out.println( "Yes , I am still alive");          }  else {              System.out.println( "No , I am dead");          }          SAVE_HOOK =  null;          System.gc();          Thread.sleep( 500);           if (null != SAVE_HOOK) {              System.out.println( "Yes , I am still alive");          }  else {              System.out.println( "No , I am dead");          }      }         @Override       protected void finalize() throws Throwable {           super.finalize();          System.out.println( "execute method finalize()");          SAVE_HOOK =  this;      }  }

Java finalize() 方法总结相关推荐

  1. java finalize方法总结、GC执行finalize的过程

    java finalize方法总结.GC执行finalize的过程 分类: Java 2013-10-06 16:42  73人阅读  评论(0)  收藏  举报 finalize java jvm ...

  2. java finalize方法的使用

    <JAVA编程思想>: Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize(). (1).对象不一定会被回收. (2).垃圾回收不是析构函数. ( ...

  3. Java finalize方法

    当对象被回收时,系统自动调用该对象的finalize方法.子类可以重写该方法,做一些释放资源的操作. 当某个对象没有任何引用时,则jvm就认为这个对象是一个垃圾对象.就会使用垃圾回收机制来销毁该对象, ...

  4. Java finalize()的使用

    Java finalize() 转载地址:java finalize方法总结.GC执行finalize的过程 - ScaleZ - 博客园 (cnblogs.com) finalize()介绍 fin ...

  5. java object finalize_Java Object finalize() 方法

    Object finalize() 方法用于实例被垃圾回收器回收的时触发的操作. 当 GC (垃圾回收器) 确定不存在对该对象的有更多引用时,对象的垃圾回收器就会调用这个方法. 语法 protecte ...

  6. Java将弃用finalize()方法?

    最近,OpenJDK邮件组core-libs-dev里出现了一封邮件,建议弃用Object类的finalize()方法. \\ 弃用Object类的方法将会是一件非常不寻常的事情.Java从 1.0开 ...

  7. 在java中finalize_在Java垃圾回收中使用finalize()方法

    当垃圾收集器确定不再对特定对象进行引用时,该finalize()方法将由该对象上的垃圾收集器调用.该finalize()方法不需要参数,也不返回值. finalize()给出了演示Java方法的程序, ...

  8. Java中finalize方法用途何在?

    1 package thinking.in.java.demo; 2 3 /* 4 * finalize的用途何在? 5 * 6 *本例的终止条件是L所有的Book对象在被当做垃圾回收前都应该被签入. ...

  9. java finalize逃脱_关于Java中的finalize()方法

    java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize(). (1).对象不一定会被回收. (2).垃圾回收不是析构函数. (3).垃圾回收只与内存有关. (4) ...

最新文章

  1. HoughLinesP函数(概率检测直线)
  2. 公司的API接口被刷了,那是因为你没这样做!
  3. 033-Unit 5 Standard I/O and Pipes
  4. 【最详细解析】1070 结绳 (25分)_18行代码AC
  5. 蓬勃发展的社区将帮助您的项目成功的6种方式
  6. centos安装wget_宝塔是干什么的?3分钟教会你云服务器上安装宝塔面板
  7. 虚幻引擎插件 - Maya LiveLink - 安装和使用
  8. 教大家一个快速批量去水印下载快手视频、图集的方法技巧
  9. 【论文】(COPRA)Finding overlapping communities in networks by label propagation
  10. 小麦积分墙:如何更好的使用积分墙
  11. 【EverydaySport】健身笔记——人体肌肉分解图
  12. assets文件使用
  13. 7个实用的免费网站托管站点
  14. 图灵计算机科学丛书•《具体数学中文版》下载
  15. MapReduce学习1:MapReduce基本概念
  16. (一)Deep learning论文纯翻译
  17. 讲清MVC、MVP、MVVM,看这一篇文章就够了
  18. [非卷积5D中文翻译及学习笔记] 神经辐射场 NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
  19. 端口大全汇总--后续有更新会添加
  20. PPT如何带走自己的字体?

热门文章

  1. Unity3D 虚拟现实开发(五)-UI篇
  2. 粗暴解决node-gyp的configure error问题
  3. 关于JavaScript时间戳及其与日期对象的相互转换
  4. ===哒哒哒,我来啦===
  5. 尚硅谷2020最新版宋红康JVM教程-中篇-第4章:再谈类的加载器-02和03-类的加载器分类
  6. MySQL - 清空表数据 truncate;delete;drop
  7. hydra(九头蛇)暴力破解
  8. 生成式AI助力出门问问赴港IPO,李志飞能否成为中国的OpenAI?
  9. foreman自动化工具安装使用
  10. 互联网产品的分类总结