Object类九大方法之finalize方法
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方法相关推荐
- Object类九大方法之notify和notifyAll方法
Object类九大方法之notify和notifyAll方法 notify()方法表示,当前的线程已经放弃对资源的占有, 通知等待的线程来获得对资源的占有权,但是只有一个线程能够从wait状态中恢复, ...
- Object类九大方法之wait方法
Object类九大方法之wait方法 wait.notify和notifyAll方法是Object类的final native方法.所以这些方法不能被子类重写,Object类是所有类的超类,因此在程序 ...
- Object类九大方法之getClass方法
Object类九大方法之getClass方法 https://www.cnblogs.com/wsw-bk/p/8026266.html 获取此Object的运行时类. 什么是运行时类? 在创建对象前 ...
- 软件测试方法——黑盒测试九大用例设计方法
笔者:风起怨江南 出处:https://blog.csdn.net/JackMengJin 笔者原创,文章转载需注明,如果喜欢请点赞+关注,感谢支持! 导读:面试和工作必备的九大黑盒软件测试方法. 目 ...
- 漫画:Object类很大,你忍一下
----- 第二天 ----- ------------ 想要了解clone方法的小伙伴,可以看看之前所讲解 原型模式 getClass() getClass方法是干什么的呢?首先,getClas ...
- 系统提示“内存不足”的九大原因及解决方法
一.剪贴板占用了太多的内存 实际上,剪贴板是内存中的一块临时区域,当你在程序中使用了"复制"或"剪切"命令后,Windows将把复制或剪切的内容及其格式等信息暂 ...
- “内存不足”的九大原因及解决方法
一.剪贴板占用了太多的内存 实际上,剪贴板是内存中的一块临时区域,当你在程序中使用了"复制"或"剪切"命令后,Windows将把复制或剪切的内容及其格式等信息暂 ...
- 漫画:Object 类很大,你忍一下(完结篇)
作者 | 东风玖哥,小灰 来源 | 程序员小灰(ID:chengxuyuanxiaohui) 这一次,我们来重点讲解 wait(),notify(),notifyAll() 这三大方法. // ...
- Object类中有哪些方法
2019独角兽企业重金招聘Python工程师标准>>> Object类中的方法介绍 类Object是类层次结构的根类,每一个类都使用Object作为超类,所有对象(包括数组)都实现这 ...
最新文章
- python编程案例教程书籍-清华大学出版社-图书详情-《Python开发案例教程》
- 机器学习数据倾斜的解决方法_机器学习并不总是解决数据问题的方法
- SQL中及Access的空值
- 【计算机组成原理】I/O系统
- bash 的环境配置文件
- 如何计算一组数据的波动幅度_如何用Excel计算一个投资组合(双资产/三资产)的波动率?...
- 补天五星计划范围更新,还有单个漏洞额外10000元现金奖励?!
- 简单记录一下做的项目过程中踩过的坑
- 分子动力学模拟AMBER参数意义
- 复杂网络分析工具及其比较(转)
- 【广东大学生网络攻防大赛-WriteUp(非官方)】Pwn | jmp_rsp
- 21. 合并两个有序链表 C语言
- python卡方拟合性检验_卡方分布、卡方独立性检验和拟合性检验理论及其python实现...
- EasyCVR平台如何实现超低延时的安防视频监控直播?
- js控制蓝牙笔翻页功能(键盘事件)
- 送给作为程序员的TA的11份礼物
- 【网络教程】IPtables官方教程--学习笔记3
- sed字符串替换用法大全
- PiMuseum-游戏开发入门级教程-中国象棋-Chapter-3
- excel不均匀坐标轴_使用不等距的坐标轴标签来改变Excel图表的展现形态的方法...
热门文章
- 【笔记】unity大地图分块加载
- 测试小故事10:时间与耐性
- android7.0版本手机,简直神速 安卓7.0新版本发布 老款安卓手机照样流畅运行
- nodejs学习分享
- 树状数组(详细分析+应用),看不懂打死我!
- [艾兰岛][Ylands]艾兰岛编辑器的前世今生
- Python_faker (伪装者)创建假数据
- 帮我用java 写个二维码识别工具
- java futuretask 源码_java并发编程——FutureTask源码分析
- 1A1C、2A2C多口快充电源设计,支持PD3.1