Object类九大方法之finalize方法

finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法。

finalize的作用

(1)finalize()与C++中的析构函数不是对应的。C++中的析构函数调用的时机是确定的(对象离开作用域或delete掉),但Java中的finalize的调用具有不确定性

(2)不建议用finalize方法完成“非内存资源”的清理工作,但建议用于:① 清理本地对象(通过JNI创建的对象);② 作为确保某些非内存资源(如Socket、文件等)释放的一个补充:在finalize方法中显式调用其他资源释放方法。其原因可见下文[finalize的问题]

[finalize的问题]

(1)一些与finalize相关的方法,由于一些致命的缺陷,已经被废弃了,如System.runFinalizersOnExit()方法、Runtime.runFinalizersOnExit()方法

(2)System.gc()与System.runFinalization()方法增加了finalize方法执行的机会,但不可盲目依赖它们

(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)

achable,回收其内存(I)

(8)若对象并未覆盖finalize方法,JVM会进行优化,直接回收对象(O)

(9)注:System.runFinalizersOnExit()等方法可以使对象即使处于reachable状态,JVM仍对其执行finalize方法

Object类九大方法之finalize方法相关推荐

  1. Object类九大方法之notify和notifyAll方法

    Object类九大方法之notify和notifyAll方法 notify()方法表示,当前的线程已经放弃对资源的占有, 通知等待的线程来获得对资源的占有权,但是只有一个线程能够从wait状态中恢复, ...

  2. Object类九大方法之wait方法

    Object类九大方法之wait方法 wait.notify和notifyAll方法是Object类的final native方法.所以这些方法不能被子类重写,Object类是所有类的超类,因此在程序 ...

  3. Object类九大方法之getClass方法

    Object类九大方法之getClass方法 https://www.cnblogs.com/wsw-bk/p/8026266.html 获取此Object的运行时类. 什么是运行时类? 在创建对象前 ...

  4. 软件测试方法——黑盒测试九大用例设计方法

    笔者:风起怨江南 出处:https://blog.csdn.net/JackMengJin 笔者原创,文章转载需注明,如果喜欢请点赞+关注,感谢支持! 导读:面试和工作必备的九大黑盒软件测试方法. 目 ...

  5. 漫画:Object类很大,你忍一下

    -----  第二天  ----- ------------ 想要了解clone方法的小伙伴,可以看看之前所讲解 原型模式 getClass() getClass方法是干什么的呢?首先,getClas ...

  6. 系统提示“内存不足”的九大原因及解决方法

    一.剪贴板占用了太多的内存 实际上,剪贴板是内存中的一块临时区域,当你在程序中使用了"复制"或"剪切"命令后,Windows将把复制或剪切的内容及其格式等信息暂 ...

  7. “内存不足”的九大原因及解决方法

    一.剪贴板占用了太多的内存 实际上,剪贴板是内存中的一块临时区域,当你在程序中使用了"复制"或"剪切"命令后,Windows将把复制或剪切的内容及其格式等信息暂 ...

  8. 漫画:Object 类很大,你忍一下(完结篇)

    ‍‍ 作者 | 东风玖哥,小灰 来源 | 程序员小灰(ID:chengxuyuanxiaohui) 这一次,我们来重点讲解 wait(),notify(),notifyAll() 这三大方法. // ...

  9. Object类中有哪些方法

    2019独角兽企业重金招聘Python工程师标准>>> Object类中的方法介绍 类Object是类层次结构的根类,每一个类都使用Object作为超类,所有对象(包括数组)都实现这 ...

最新文章

  1. python编程案例教程书籍-清华大学出版社-图书详情-《Python开发案例教程》
  2. 机器学习数据倾斜的解决方法_机器学习并不总是解决数据问题的方法
  3. SQL中及Access的空值
  4. 【计算机组成原理】I/O系统
  5. bash 的环境配置文件
  6. 如何计算一组数据的波动幅度_如何用Excel计算一个投资组合(双资产/三资产)的波动率?...
  7. 补天五星计划范围更新,还有单个漏洞额外10000元现金奖励?!
  8. 简单记录一下做的项目过程中踩过的坑
  9. 分子动力学模拟AMBER参数意义
  10. 复杂网络分析工具及其比较(转)
  11. 【广东大学生网络攻防大赛-WriteUp(非官方)】Pwn | jmp_rsp
  12. 21. 合并两个有序链表 C语言
  13. python卡方拟合性检验_卡方分布、卡方独立性检验和拟合性检验理论及其python实现...
  14. EasyCVR平台如何实现超低延时的安防视频监控直播?
  15. js控制蓝牙笔翻页功能(键盘事件)
  16. 送给作为程序员的TA的11份礼物
  17. 【网络教程】IPtables官方教程--学习笔记3
  18. sed字符串替换用法大全
  19. PiMuseum-游戏开发入门级教程-中国象棋-Chapter-3
  20. excel不均匀坐标轴_使用不等距的坐标轴标签来改变Excel图表的展现形态的方法...

热门文章

  1. 【笔记】unity大地图分块加载
  2. 测试小故事10:时间与耐性
  3. android7.0版本手机,简直神速 安卓7.0新版本发布 老款安卓手机照样流畅运行
  4. nodejs学习分享
  5. 树状数组(详细分析+应用),看不懂打死我!
  6. [艾兰岛][Ylands]艾兰岛编辑器的前世今生
  7. Python_faker (伪装者)创建假数据
  8. 帮我用java 写个二维码识别工具
  9. java futuretask 源码_java并发编程——FutureTask源码分析
  10. 1A1C、2A2C多口快充电源设计,支持PD3.1