JVM之枚举GC Roots 根节点,安全点,安全区域。
引言
判断对象是否被回收的算法有引用计数算法和可达性分析算法。
引用计数法:
可达性分析算法:是根据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 根节点,安全点,安全区域。相关推荐
- java gc roots_Java 虚拟机枚举 GC Roots 解析
JVM 堆内存模型镇楼. 读<深入理解 Java 虚拟机>第三章GC算法,关于 GC Roots 枚举的段落没说透彻,理解上遇到困惑.因此对这点进行扩展并记录,发现国内各种博客写来写去都是 ...
- Java 虚拟机枚举 GC Roots 解析
原始链接:https://www.leahy.club/archives/gcroots 最近在复习JVM,在看<深入理解Java虚拟机>中关于GC Roots的描述不是很明白,就收集了相 ...
- 【JVM】GC Roots 根可达
文章目录 1.概述 1.引用计数法 2.可达性分析 2.1.基本概念 2.2 哪些是gc root 2.2.多线程环境存在问题 2.2.1.Stop-the-world以及安全点 3.垃圾回收的三种方 ...
- java gc 对象可达性_JVM垃圾回收系列---GC Roots可达性分析
JVM的垃圾回收对于Java开发人员来说是比较透明的,本文采用问答的形式进行展开,希望能够解释下垃圾回收的一些问题.那么首先第一个问题 问:什么样的对象会被回收. 答:已经死亡的对象,不可达的对象,肯 ...
- JVM原理及GC优化
JVM的底层原理及GC优化 JVM的的主要组成及其作用 类的加载机制 JVM内存模型深度剖析与优化 JVM对象创建与内存分配机制 垃圾收集器及垃圾收集算法 垃圾收集器底层算法实现 字符串常量池 八种基 ...
- jvm根节点枚举、安全点、安全区域、记忆集、卡表、写屏障、并发的可达性分析
讲具体的实现之前,先说说几个和这些垃圾回收器息息相关的一些知识点,可以有一个更好的理解 1.根节点枚举 也就是可达性分析算法从GC Roots集合中找引用链的过程,可作为GC Roots的节点主要在全 ...
- JAVA虚拟机 安全区域_JVM虚拟机如何枚举根节点:原理、安全点和安全区域
原标题:JVM虚拟机如何枚举根节点:原理.安全点和安全区域 枚举根节点--可作为GC Roots的节点 可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的 ...
- JVM的进阶学习(GC Roots、JVM调优与参数配置、)
1. GC Roots,可达性分析 从GC roots的对象作为起始点,从GC Roots对象开始向下搜索,如果一个对象到GCRoots没有任何引用链相连,则说明对象不可用.即给定一个集合的引用作为根 ...
- 使用MAT做jvm的GC Roots溯源
MAT是Memory Analyzer的简称,它是一款功能强大的Java堆内存分析器.用于查找内存泄漏以及查看内存消耗情况. MAT是基于Eclipse开发的,是一款免费的性能分析工具. http:/ ...
最新文章
- 石川es6课程---8、字符串
- Swift结构体与类
- [YTU]_2441( C++习题 复数类--重载运算符2+)
- 实例解说Linux命令行uniq (转)
- 测试开发面试准备之python selenium API
- Angular Universal 学习笔记
- java 打不开空客手册_空客A320AMM维护手册使用介绍.ppt
- MFC多语言实现方法
- AT4513-[AGC030D]InversionSum【dp】
- QT5主界面“关闭窗口”按钮设置弹出提示询问信息
- 一个神奇的bug:OOM?优雅终止线程?系统内存占用较高?
- python api调用百度ai平台_Python 百度AI接口调用
- JMeter配置元件【HTTP请求默认值】
- ubuntu下lvs负载均衡dr模型shell脚本
- 图片居中裁剪_魔镜,魔镜,谁最美丽!利用PS图层混合模式打造图片幻觉效果
- node.js常见问题之:解决npm install出错(Cannot find module ‘internal/util/types‘)
- 【现代软件工程】6月中旬团队项目心得
- 不显示藏宝阁试穿服务器,梦幻西游:藏宝阁试穿功能的妙用,无限回档测试
- Java学习路线总结(思维导图篇)
- 做自媒体数据分析的一些工具
热门文章
- ECDH 密钥交换举例(ECDH Key Exchange - Examples)
- nginx排查502错误
- AWS VPC Peering Azure VNET Peering
- 当工厂走出“工厂”,直营店也不止于“店”
- 6个超实用的自媒体工具,百万博主都在用
- JQuery效果动画
- 服务器系统网口,服务器网口设置方法
- 学计算机的人会单身吗,大学哪些专业最容易单身 大学哪些专业最不容易脱单...
- 贪心算法_排队不等式_绝对值不等式_推公式
- 计算机程序必须具有硬盘才能工作吗,2016年3月计算机一级考试WPS试题及答案