



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
深入理解java的finalize2010-10-08 19:18:32|分类:Java语法、语言特|标签:finalizegc对象reachablequeue|字号订阅目录基本预备相关知识对象的销毁过程对象重生的例子对象的finalize的执行顺序何时及如何使用finalize参考基本预备相关知识1 java的GC只负责内存相关的清理,所有其它资源的清理必须由程序员手工完成。要不然会引起资源泄露,有可能导致程序崩溃。2 调用GC并不保证GC实际执行。3 finalize抛出的未捕获异常只会导致该对象的finalize执行退出。4 用户可以自己调用对象的finalize方法,但是这种调用是正常的方法调用,和对象的销毁过程无关。5 JVM保证在一个对象所占用的内存被回收之前,如果它实现了finalize方法,则该方法一定会被调用。Object的默认finalize什么都不做,为了效率,GC可以认为一个什么都不做的finalize不存在。6 对象的finalize调用链和clone调用链一样,必须手工构造。如Java代码1. protectedvoidfinalize()throwsThrowable2. super.finalize();3. 对象的销毁过程在对象的销毁过程中,按照对象的finalize的执行情况,可以分为以下几种,系统会记录对象的对应状态:unfinalized 没有执行finalize,系统也不准备执行。finalizable 可以执行finalize了,系统会在随后的某个时间执行finalize。finalized 该对象的finalize已经被执行了。GC怎么来保持对finalizable的对象的追踪呢。GC有一个Queue,叫做F-Queue,所有对象在变为finalizable的时候会加入到该Queue,然后等待GC执行它的finalize方法。这时我们引入了对对象的另外一种记录分类,系统可以检查到一个对象属于哪一种。reachable 从活动的对象引用链可以到达的对象。包括所有线程当前栈的局部变量,所有的静态变量等等。finalizer-reachable 除了reachable外,从F-Queue可以通过引用到达的对象。unreachable 其它的对象。来看看对象的状态转换图。好大,好晕,慢慢看。1 首先,所有的对象都是从Reachable+Unfinalized走向死亡之路的。2 当从当前活动集到对象不可达时,对象可以从Reachable状态变到F-Reachable或者Unreachable状态。3 当对象为非Reachable+Unfinalized时,GC会把它移入F-Queue,状态变为F-Reachable+Finalizable。4 好了,关键的来了,任何时候,GC都可以从F-Queue中拿到一个Finalizable的对象,标记它为Finalized,然后执行它的finalize方法,由于该对象在这个线程中又可达了,于是该对象变成Reachable了(并且Finalized)。而finalize方法执行时,又有可能把其它的F-Reachable的对象变为一个Reachable的,这个叫做对象再生。5 当一个对象在Unreachable+Unfinalized时,如果该对象使用的是默认的Object的finalize,或者虽然重写了,但是新的实现什么也不干。为了性能,GC可以把该对象之间变到Reclaimed状态直接销毁,而不用加入到F-Queue等待GC做进一步处理。6 从状态图看出,不管怎么折腾,任意一个对象的finalize只至多执行一次,一旦对象变为Finalized,就怎么也不会在回到F-Queue去了。当然没有机会再执行finalize了。7 当对象处于Unreachable+Finalized时,该对象离真正的死亡不远了。GC可以安全的回收该对象的内存了。进入Reclaimed。对象重生的例子Java代码1. classC2. staticAa;3. 4. 5. classA6. Bb;7. 8. publicA(Bb)9. this.b=b;10. 11. 12. Override13. publicvoidfinalize()14. System.out.println(Afinalize);15. C.a=this;16. 17. 18. 19. classB20. Stringname;21. intage;22. 23. publicB(Stringname,intage)24. =name;25. this.age=age;26. 27. 28. Override29. publicvoidfinalize()30. System.out.println(Bfinalize);31. 32. 33. Override34. publicStringtoString()35. returnname+is+age;36. 37. 38. 39. publicclassMain40. publicstaticvoidmain(Stringargs)throwsException41. Aa=newA(newB(allen,20);42. a=null;43. 44. System.gc();45. Thread.sleep(5000);46. System.out.println(C.a.b);47. 48. 期待输出Java代码1. Afinalize2. Bfinalize3. allenis20但是有可能失败,源于GC的不确定性以及时序问题,多跑几次应该可以有成功的。详细解释见文末的参考文档。对象的finalize的执行顺序所有finalizable的对象的finalize的执行是不确定的,既不确定由哪个线程执行,也不确定执行的顺序。考虑以下情况就明白为什么了,实例a,b,c是一组相互循环引用的finalizable对象。何时及如何使用finalize从以上的分析得出,以下结论。1 最重要的,尽量不要用finalize,太复杂了,还是让系统照管比较好。可以定义其它的方法来释放非内存资源。2 如果用,尽量简单。3 如果用,避免对象再生,这个是自己给自己找麻烦。4 可以用来保护非内存资源被释放。即使我们定义了其它的方法来释放非内存资源,但是其它人未必会调用该方法来释放。在finalize里面可以检查一下,如果没有释放就释放好了,晚释放总比不释放好。5 即使对象的fin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年中国烟草零售市场运营态势分析及投资前景预测报告
- 2025年中国金属眼镜行业市场全景分析及前景机遇研判报告
- 中国无线转接台行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)
- 2025年原油项目可行性研究报告
- 电子玩具相册项目投资可行性研究分析报告(2024-2030版)
- 2025年 湟源县教育局招聘高中教师考试试题附答案
- 2025年 阜阳颍州区柳林路幼儿园教师招聘考试笔试试题附答案
- 特细条灯芯绒项目投资可行性研究分析报告(2024-2030版)
- 更换超滤膜申请表及可研报告(最终版)【范本模板】
- 2025年中国共享头盔行业市场发展监测及投资战略咨询报告
- 2022-2023学年广东肇庆市数学高二第二学期期末联考模拟试题含解析
- 新版心肺复苏流程图
- 与食品安全相关的组织机构设置、部门职能和岗位职责
- 法院送达地址确认书
- 项目管理手册(最终完成版)
- 金蝶云星空 V7.2产品培训-财务-标准成本分析
- 数学课堂教学观察量表
- 附件1:团籍证明模板-0
- 临时堆放物料申请书临时堆放材料申请(4篇)
- 成人礼仪式策划书
- 部编版八年级语文下册实践性作业教案
评论
0/150
提交评论