看深入理解java虚拟机的时候看到3.2.4节生存还是死亡(to be or not to be)的时候看到的一段代码

有趣分享给大家

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

如果这个对象被判定为确有必要执行finalize()方法,那么该对象将会被放置在一个名为F-Queue的 队列之中,并在稍后由一条由虚拟机自动建立的、低调度优先级的Finalizer线程去执行它们的finalize() 方法。这里所说的“执行”是指虚拟机会触发这个方法开始运行,但并不承诺一定会等待它运行结束。 这样做的原因是,如果某个对象的finalize()方法执行缓慢,或者更极端地发生了死循环,将很可能导 致F-Queue队列中的其他对象永久处于等待,甚至导致整个内存回收子系统的崩溃。finalize()方法是对 象逃脱死亡命运的最后一次机会,稍后收集器将对F-Queue中的对象进行第二次小规模的标记,如果对 象要在finalize()中成功拯救自己——只要重新与引用链上的任何一个对象建立关联即可,譬如把自己 (this关键字)赋值给某个类变量或者对象的成员变量,那在第二次标记时它将被移出“即将回收”的集 合;如果对象这时候还没有逃脱,那基本上它就真的要被回收了。从代码清单3-2中我们可以看到一个 对象的finalize()被执行,但是它仍然可以存活。

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 method executed!");FinalizeEscapeGc.SAVE_HOOK = this;}public static void main(String[] args) throws InterruptedException {SAVE_HOOK = new FinalizeEscapeGc();//对象第一次成功拯救自己SAVE_HOOK = null;System.gc();/// 因为Finalizer方法优先级很低,暂停0.5秒,以等待它Thread.sleep(500);if (SAVE_HOOK != null) {//走进这里说明gc出发finalize了SAVE_HOOK.isAlive();} else {System.out.println("no, i am dead :(");}// 下面这段代码与上面的完全相同,但是这次自救却失败了SAVE_HOOK = null;System.gc();// 因为Finalizer方法优先级很低,暂停0.5秒,以等待它Thread.sleep(500);if (SAVE_HOOK != null) {SAVE_HOOK.isAlive();} else {//finalize只允许执行依次System.out.println("no, i am dead :(");}}
}

运行结果:

我们在main方法中设置了SAVE_HOOK = null;相当于这个对象为null,当我们调用System.gc();垃圾回收的时候,虽然这个对象被认为是不可达的,但是因为覆盖了finalize()方法,所以会执行finalize()方法,当我们第二次调用System.gc();垃圾回收因为finalize()方法已经被执行了一遍了不能再执行所以此时真正认为该对象为垃圾对象。这就是上述的可达性分析的两次标记

可达性分析算法代码举例相关推荐

  1. 【Java 虚拟机原理】垃圾回收算法 ( 可达性分析算法 | GC Root 示例 | GC 回收前的两次标记 | finalize 方法示例 )

    文章目录 一.可达性分析算法 二.GC Root 示例 三.GC 回收前的两次标记 四.finalize 方法示例 一.可达性分析算法 在 堆内存 中 , 存在一个 根对象 GC Root , GC ...

  2. JVM 垃圾回收算法 -可达性分析算法!!!高频面试!!!

    前言:学习JVM,那么不可避免的要去了解JVM相关的垃圾回收算法,本文只是讲了讲了可达性分析算法,至于标记-清除.标记-复制,标记-整理,分代收集等等算法,会在近两天的文章中陆续更新出来. 很喜欢一句 ...

  3. 3.内存分配、逃逸分析与栈上分配、直接内存和运行时常量池、基本类型的包装类和常量池、TLAB、可达性分析算法(学习笔记)

    3.JVM内存分配 3.1.内存分配概述 3.2.内存分配–Eden区域 3.3.内存分配–大对象直接进老年代 3.3.1.背景 3.3.2.解析 3.4.内存分配–长期存活的对象进去老年代 3.5. ...

  4. 引用计数器法 可达性分析算法_面试官:你说你熟悉jvm?那你讲一下并发的可达性分析...

    持续输出原创文章,点击蓝字关注我吧 上面这张图是我还是北漂的时候,在鼓楼附近的胡同里面拍的. 那天刚刚下完雨,路过这个地方的时候,一瞬间就被这五颜六色的门板和自行车给吸引了,于是拍下了这张图片.看到这 ...

  5. 深入理解JVM03--判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用

    本文是基于周志明的<深入理解Java虚拟机> 堆中几乎存放着Java世界中所有的对象实例,垃圾收集器在对堆回收之前,第一件事情就是要确定这些对象哪些还"存活"着,哪些对 ...

  6. 深入理解JVM(三)——JVM之判断对象是否存活(引用计数算法、可达性分析算法,最终判定),Eclipse设置GC日志输出,引用

    本文转载自https://blog.csdn.net/ochangwen/article/details/51406779 本文是基于周志明的<深入理解Java虚拟机> 堆中几乎存放着Ja ...

  7. JAVA垃圾回收-可达性分析算法

    在java中是通过引用来和对象进行关联的,也就是说如果要操作对象,必须通过引用来进行.那么很显然一个简单的办法就是通过引用计数来判断一个对象是否可以被回收.不失一般性,如果一个对象没有任何引用与之关联 ...

  8. 可达性分析算法(自用)

    在Java中,是通过可达性分析(Reachability Analysis)来判定对象是否存活的.该算法的基本思路就是通过一些被称为引用链(GC Roots)的对象作为起点,从这些节点开始向下搜索,搜 ...

  9. 可达性分析算法-针对的对象

    可达性分析算法的基本思想,(由于该算法是JVM垃圾回收判断对象死亡的基本算法)这里,我们对上一篇讲的关于可达性分析算法做一个更加细致的研究: 首先是根节点(GC Roots):作为可达性算法的初始节点 ...

  10. JVM——引用计数算法与可达性分析算法

    前几篇博客我们一起认识了JVM的内存模型(程序计数器.虚拟机栈.本地方法栈.方法区与堆),了解了它们的内存结构与分配,同时也略带提到关于内存的回收. JVM--内存模型(一):程序计数器 JVM--内 ...

最新文章

  1. Kati详解-Android10.0编译系统(五)
  2. python第五章课后题答案超星_MOOC网课章节答案_Python 语言程序设计见面课测试答案...
  3. zabbix mysql版本号_zabbix 监控mysql5.6版本 及主从
  4. LeetCode简单题(一)
  5. 【Flink】Flink 1.13 将数据 写入 到 elasticsearch 7 案例
  6. 安卓工控主板运行时会自动重启_工控机日常维护的方法与步骤
  7. 图像的抽线、抽丝、抽图 神马是alpha通道
  8. 抗住 60 亿次攻击,起底阿里云安全的演进之路 | 问底中国 IT 技术演进
  9. uml定义的使用的关系
  10. “钱景”没了?莫慌,内容创业还有七大红利
  11. c语言 倒计时不清屏_c语言 清屏函数
  12. 崩坏3区号+86_今天才知道手机号前的+86是这个意思
  13. 2N个数排成一行(每个数有2个), 2个1之间有1个数,2个2 之间有2个数,...2个N之间有N个数... 例312132
  14. 欧洲杯上链,区块链语境下的数字化有什么不一样?
  15. 寻找 漂亮主题 桌面主题
  16. C# 实现窗口程序winform像QQ一样靠近桌面边缘自动隐藏窗口
  17. Redist过期策略、应用、持久化
  18. 抖音测试像哪个明星的软件,抖音中的测测你像哪位明星特效如何拍摄
  19. 演员选择框三级联动(原生javascript和jquery实现)
  20. 携程产品经理群面面经(含题目与答案)

热门文章

  1. 多选框取值和默认勾选
  2. Android仿微信朋友圈10s视频编辑
  3. 含泪推荐四款超级好用的电脑软件,值得收藏
  4. 查看磁盘文件夹大小工具WinDirStat
  5. 【LeetCode】75. 颜色分类,使得相同颜色的元素相邻
  6. C++ Boost库:互斥量 mutex
  7. python代码美化工具black
  8. 今日头条笔试之手串问题
  9. imindmap思维导图免费下载
  10. html 倒计时小工具