二、被GC判断为“垃圾”的对象一定会被回收吗

即使在可达性分析算法中不可达对象,也并非是“非死不可”的,这时它们暂时出于“缓刑”阶段,要真正宣告一个对象死亡,至少要经过两次标记过程:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有比要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将这两种情况都视为“没有必要执行”。(即意味着直接回收)。

如果这个对象被判定为有必要执行finalize()方法,那么这个对象将会放置在一个叫做F-Queue的队列之中,并在稍后由一个由虚拟机自动建立的、低优先级的Finalizer线程去执行它。这里所谓的“执行”是指虚拟机会触发这个方法,但并不承诺会等待它运行结束,这样做的原因是,如果一个对象在finalize()方法中执行缓慢,或者发生了死循环(更极端的情况),将很可能会导致F-Queue队列中其他对象永久处于等待,甚至导致整个内存回收系统崩溃。

finalize()方法是对象逃脱死亡命运的最后一次机会,稍后GC将对F-Queue中的对象进行第二次小规模的标记,如果对象要在finalize()中成功拯救自己——只要重新与引用链上的任何一个对象建立关联即可,譬如把自己(this关键字)赋值给某个类变量或者对象的成员变量,那在第二次标记时它将被移除出“即将回收”的集合;如果对象这时候还没有逃脱,那基本上它就真的被回收了。

以下的例子说明了这个问题:

public class FinalizeEscapeGC {public static FinalizeEscapeGC SAVE_HOOK = null;public void isAlive() {System.out.println("yes,i am still alive:)");}@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println("finalize mehtod executed!");FinalizeEscapeGC.SAVE_HOOK = this;}public static void main(String[] args) throws Throwable {SAVE_HOOK = new FinalizeEscapeGC();// 对象第一次成功拯救自己SAVE_HOOK = null;System.gc();// 因为finalize方法优先级很低,所以暂停0.5秒以等待它Thread.sleep(500);if (SAVE_HOOK != null) {SAVE_HOOK.isAlive();} else {System.out.println("no,i am dead:(");}// 下面这段代码与上面的完全相同,但是这次自救却失败了SAVE_HOOK = null;System.gc();// 因为finalize方法优先级很低,所以暂停0.5秒以等待它Thread.sleep(500);if (SAVE_HOOK != null) {SAVE_HOOK.isAlive();} else {System.out.println("no,i am dead:(");}}
}

运行结果:

finalize mehtod executed!
yes,i am still alive:)
no,i am dead:(

SAVE_HOOK对象的finalize()方法确实被GC收集器触发过,并且在被收集前成功逃脱了。另外一个值得注意的地方是,代码中有两段完全一样的代码片段,执行结果却是一次逃脱成功,一次失败,这是因为任何一个对象的finalize()方法都只会被系统自动调用一次,如果对象面临下一次回收,它的finalize()方法不会被再次执行,因此第二段代码的自救行动失败了。因为finalize()方法已经被虚拟机调用过,虚拟机都视为“没有必要执行”。(即意味着直接回收)

垃圾回收中的finalize方法相关推荐

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

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

  2. 53.垃圾回收算法的实现原理、启动Java垃圾回收、Java垃圾回收过程、垃圾回收中实例的终结、对象什么时候符合垃圾回收的条件、GC Scope 示例程序、GC OutOfMemoryError的示例

    53.垃圾回收算法的实现原理 53.1.目录 53.2.启动Java垃圾回收 53.3.Java垃圾回收过程 53.4.垃圾回收中实例的终结 53.5.对象什么时候符合垃圾回收的条件? 53.5.1. ...

  3. 关于java中的finalize()方法

    关于finalize()方法,之前了解的并不是很多,看<java编程思想>时才对此有所了解,之后我又看了些博客,稍微总结了一下finalize()方法: java提供finalize()方 ...

  4. Java中的finalize方法

    一.介绍 当一个对象没有引用的时候,对象的垃圾回收器会调用finalize方法. 当对象被回收时,系统自动调用该对象的finalize方法,子类可以重写该方法,做一些释放资源的操作. 什么时候被回收: ...

  5. java finalize 作用_java中的finalize方法有什么作用

    java中的finalize方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法. finalize()方法是Object类中提供的一个方 ...

  6. Java程序员的日常—— 垃圾回收中引用类型的作用

    在Java里面,是不需要太过于关乎垃圾回收,但是这并不意味着开发者可以不了解垃圾回收的机制,况且在java中内存泄露也是家常便饭的事情.因此了解垃圾回收的相关知识就显得很重要了. 引用,在垃圾回收中是 ...

  7. 垃圾回收中的安全点与安全区域

    文章目录 1. 垃圾回收中的安全点 2. 垃圾回收中的安全区域 1. 垃圾回收中的安全点 安全点:程序执行过程中需要进行垃圾回收时,只有在特定的位置停顿下来开始进行GC,这些特定位置称之为安全点(Sa ...

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

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

  9. 关于Java中的finalize方法

    随时随地技术实战干货,获取项目源码.学习资料,请关注源代码社区公众号(ydmsq666) 当垃圾回收机制回收某个对象所占用的内存之前,通常要求程序调用适当的方法来清理资源,在没有明确指定资源清理的情况 ...

  10. java的finalize_Java中的finalize()方法

    展开全部 先占个位  等下看看能不能解答 补充: 看 main() 中的 System.gc() 这个是 运行垃圾回收器.API中的方法说明62616964757a686964616fe58685e5 ...

最新文章

  1. 11 个 Linux 终端命令,没用过的快去试试吧!
  2. 基于用户投票的排名算法(五):威尔逊区间
  3. opencv学习笔记5:感兴趣区域ROI
  4. html和css制作动漫岛,CSS动画
  5. 【Homework】说出 == 和 equals 的区别
  6. 《深入浅出数据分析》样章下载
  7. Android顶部粘至视图具体解释
  8. Codeforces Round #735 (Div. 2)
  9. Nodejs基础01
  10. Intel 64/x86_64/IA-32/x86处理器 - 通用指令(2) - 二进制算术指令/十进制算术指令
  11. 图像滤镜艺术---(Instagram)1977滤镜
  12. 5817. 【NOIP提高A组模拟2018.8.15】 抄代码
  13. Linux Frp内网穿透
  14. Matlab求拉普拉斯变换和拉普拉斯反变换
  15. 路由器设置虚拟服务器utorrent,路由器用户PT站“可连接:否”最简解决办法
  16. java面试题学生表成绩表老师表_经典的SQL语句面试题
  17. 不藏了,我的一千行 MySQL 学习笔记(2万字长文)
  18. 微信公众平台开发测试账号配置URL失败的问题
  19. 软件设计师(计算机系统)
  20. 神经网络中的过拟合的原因及解决方法、泛化能力、L2正则化

热门文章

  1. PHP全文索引 讯搜xunsearch
  2. 灵修---士师记第9章
  3. win10北通手柄没反应_赛博朋克2077正式发售,光靠键鼠可不行,试试北通阿修罗3...
  4. 给大家安利一个买电脑好去处(内有福利)
  5. 技术要扎扎实实的做,业余功夫也要修炼
  6. 中职计算机专业学Excel,2013年中职计算机应用专业中文Excel电子表格处理实际操作练习.doc...
  7. oracle12c bug,12c expdp ORA-31623 -又遇到BUG
  8. 计算机每个人都适合学吗,代码不等于计算机科学:为什么所有人都应该学习编程...
  9. Ubuntu18.04无法进入图形界面桌面的问题及解决
  10. Android Power Placeholder | 中文教学视频