引言 

  判断对象是否被回收的算法引用计数算法可达性分析算法

引用计数法:

可达性分析算法:是根据GC Roots根节点作为起始点向下搜索引用链,找不到引用链则判定对象可回收。

可作为GC Roots根节点的对象主要是在全局性的引用(如常量、类静态属性)和执行上下文中(如栈帧中的本地变量表),现在的很多应用仅方法区就有数百兆,逐个检查里边的引用显然很耗费时间。

另外,可达性分析必须在一个确保一致性的快照中进行——这里的“一致性”的意思是指,在整个分析期间整个执行系统看起来就像被冻结在某一个时间点上,不能出现分析过程中引用关系还在不断变化的情况。

通俗的说就是进行可达性分析的时候引用关系不能发生变化。这将导致GC进行时必须停顿所有的Java执行线程。(在GC ROOTS 根节点枚举都必须暂停用户的所有线程这就是我们通常所说的stop-the-word,即使不停顿的CMS垃圾收集器,根节点枚举时也是会发生停顿。)

就是我们接下来要说的解决方案。

正文:

GC ROOTS 根节点枚举:

HotSpot中采用OOPMap来避免在数百兆的方法区里逐个检查里面的引用,避免了垃圾回收时影响效率,将GC ROOTs 根节点集合对象维护在OOPMap的数据结构中(解决快速定位GC ROOTS 对象集合问题),

首先在类加载完成的时候,HotSpot就把对象内什么偏移量上是什么类型的数据计算出来,在JIT编译过程中,也会在特定的位置记录下栈和寄存器中哪些位置是引用。这样,GC在扫描的时候,就可以根据OOPMap上记录的信息准确定位到哪个区域中有对象的引用,这样大大减少了通过逐个遍历来找出对象引用的时间消耗。

已经解决了快速定位GC ROOTS 对象集合问题,那还有一个问题,就是如何保证GC ROOTS 根节点枚举的时候,引用关系不会发生变化。解决方案-------》安全点

安全点:

导致OOPMap 发生变化的指令集非常多,如果为每条指令都生成一个OOPMap,那将需要大量的额外存储空间,显然不科学,HotSpots 也没有这么做,只是在特定位置来记录OOPMAP信息。这些特定的位置就是安全点。

即程序执行时并非在所有地方都能停顿下来开始GC,只有在到达安全点时才能暂停。Safepoint的选定既不能太少以致于让GC等待时间太长,也不能过于频繁以致于过分增大运行时的负荷。所以,”安全点“的选择基本上是以程序”是否具有让程序长时间执行的特征“为标准来选定的。因为每条执行指令执行的时间都非常地短暂,程序不太可能因为指令流长度太长这个原因而过长时间运行,而程序”长时间的运行“实际上就是指令序列的一个复用。例如方法调用、循环跳转、异常跳转等,所以具有这些功能的指令才会产生”安全点“。而当我们选取好”安全点“之后,我们又是怎样使所有执行线程跑到”安全点“时停顿下来呢?

 ② ”安全点“的两种中断方式(抢先式中断和主动式中断)

“抢先式中断”不需要线程的执行代码去主动配合,在GC发生时,首次会把所有的线程全部中断,如果发现有些线程中断点不是安全点,就恢复该线程直到安全点上停止。”主动式中断“实际上就是线程主动轮询的一个过程,当GC需要中断线程时,不直接对线程进行操作,仅仅简单的设置一个标志,这个轮询标志当然要与安全点相重合。各个线程在执行的时候都会主动去询问这个轮询标志:”我是否到了该中断的点了?“。现在大部分虚拟机都采用是”主动式中断”方式,因为它相对“抢先式中断”方式避免了一个中断——>启动——>又中断的一个过程。

设置“安全点”虽然保证了大部分线程停顿,但总有一些线程比较“懒”。例如,当GC请求中断时,该线程正在偷懒sleep(),JVM不可能等该线程睡醒之后到达安全点之后才能进行可达性分析过程,而此时如果该线程睡醒了恰巧GC又在进行可达性分析或者是回收,那该线程又该何去何从呢?所以JVM又在安全点的基础上加了一个双重保险——安全区域。

  ③ “安全点”的双重保证——安全区域

安全区域是指在一段代码片中,引用关系不会发生改变,实际上就是一个安全点的拓展。当线程执行到安全区域时,首先标识自己已进入安全区域,那样,当在这段时间里JVM要发起GC时,就不用管标识自己为“安全区域”状态的线程了,该线程只能乖乖的等待根节点枚举或者整个GC过程完成之后才能继续执行

====================如有错误请指正,谢谢============================

如何更好的理解gc请看此图。

JVM之枚举GC Roots 根节点,安全点,安全区域。相关推荐

  1. java gc roots_Java 虚拟机枚举 GC Roots 解析

    JVM 堆内存模型镇楼. 读<深入理解 Java 虚拟机>第三章GC算法,关于 GC Roots 枚举的段落没说透彻,理解上遇到困惑.因此对这点进行扩展并记录,发现国内各种博客写来写去都是 ...

  2. Java 虚拟机枚举 GC Roots 解析

    原始链接:https://www.leahy.club/archives/gcroots 最近在复习JVM,在看<深入理解Java虚拟机>中关于GC Roots的描述不是很明白,就收集了相 ...

  3. 【JVM】GC Roots 根可达

    文章目录 1.概述 1.引用计数法 2.可达性分析 2.1.基本概念 2.2 哪些是gc root 2.2.多线程环境存在问题 2.2.1.Stop-the-world以及安全点 3.垃圾回收的三种方 ...

  4. java gc 对象可达性_JVM垃圾回收系列---GC Roots可达性分析

    JVM的垃圾回收对于Java开发人员来说是比较透明的,本文采用问答的形式进行展开,希望能够解释下垃圾回收的一些问题.那么首先第一个问题 问:什么样的对象会被回收. 答:已经死亡的对象,不可达的对象,肯 ...

  5. JVM原理及GC优化

    JVM的底层原理及GC优化 JVM的的主要组成及其作用 类的加载机制 JVM内存模型深度剖析与优化 JVM对象创建与内存分配机制 垃圾收集器及垃圾收集算法 垃圾收集器底层算法实现 字符串常量池 八种基 ...

  6. jvm根节点枚举、安全点、安全区域、记忆集、卡表、写屏障、并发的可达性分析

    讲具体的实现之前,先说说几个和这些垃圾回收器息息相关的一些知识点,可以有一个更好的理解 1.根节点枚举 也就是可达性分析算法从GC Roots集合中找引用链的过程,可作为GC Roots的节点主要在全 ...

  7. JAVA虚拟机 安全区域_JVM虚拟机如何枚举根节点:原理、安全点和安全区域

    原标题:JVM虚拟机如何枚举根节点:原理.安全点和安全区域 枚举根节点--可作为GC Roots的节点 可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的 ...

  8. JVM的进阶学习(GC Roots、JVM调优与参数配置、)

    1. GC Roots,可达性分析 从GC roots的对象作为起始点,从GC Roots对象开始向下搜索,如果一个对象到GCRoots没有任何引用链相连,则说明对象不可用.即给定一个集合的引用作为根 ...

  9. 使用MAT做jvm的GC Roots溯源

    MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器.用于查找内存泄漏以及查看内存消耗情况. MAT是基于Eclipse开发的,是一款免费的性能分析工具. http:/ ...

最新文章

  1. 石川es6课程---8、字符串
  2. Swift结构体与类
  3. [YTU]_2441( C++习题 复数类--重载运算符2+)
  4. 实例解说Linux命令行uniq (转)
  5. 测试开发面试准备之python selenium API
  6. Angular Universal 学习笔记
  7. java 打不开空客手册_空客A320AMM维护手册使用介绍.ppt
  8. MFC多语言实现方法
  9. AT4513-[AGC030D]InversionSum【dp】
  10. QT5主界面“关闭窗口”按钮设置弹出提示询问信息
  11. 一个神奇的bug:OOM?优雅终止线程?系统内存占用较高?
  12. python api调用百度ai平台_Python 百度AI接口调用
  13. JMeter配置元件【HTTP请求默认值】
  14. ubuntu下lvs负载均衡dr模型shell脚本
  15. 图片居中裁剪_魔镜,魔镜,谁最美丽!利用PS图层混合模式打造图片幻觉效果
  16. node.js常见问题之:解决npm install出错(Cannot find module ‘internal/util/types‘)
  17. 【现代软件工程】6月中旬团队项目心得
  18. 不显示藏宝阁试穿服务器,梦幻西游:藏宝阁试穿功能的妙用,无限回档测试
  19. Java学习路线总结(思维导图篇)
  20. 做自媒体数据分析的一些工具

热门文章

  1. ECDH 密钥交换举例(ECDH Key Exchange - Examples)
  2. nginx排查502错误
  3. AWS VPC Peering Azure VNET Peering
  4. 当工厂走出“工厂”,直营店也不止于“店”
  5. 6个超实用的自媒体工具,百万博主都在用
  6. JQuery效果动画
  7. 服务器系统网口,服务器网口设置方法
  8. 学计算机的人会单身吗,大学哪些专业最容易单身 大学哪些专业最不容易脱单...
  9. 贪心算法_排队不等式_绝对值不等式_推公式
  10. 计算机程序必须具有硬盘才能工作吗,2016年3月计算机一级考试WPS试题及答案