JAVA虚拟机 安全区域_JVM虚拟机如何枚举根节点:原理、安全点和安全区域
原标题:JVM虚拟机如何枚举根节点:原理、安全点和安全区域
枚举根节点——可作为GC Roots的节点
可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)
枚举根节点——确保一致性的快照
这项分析工作必须在一个能确保一致性的快照中进行——在整个分析期间整个执行系统看起来就像被冻结在某个时间点上,不可以出现分析过程中对象引用关系还在不断变化的情况,该点不满足的话分析结果准确性就无法得到保证。
枚举根节点——确保一致性的快照——导致Stop The World
导致GC必须停顿所有Java执行线程(“Stop The World”),即使是在号称(几乎)不会发生停顿的CMS收集器中,枚举根节点时也是必须要停顿的。
使用OopMap标记对象引用
在HotSpot中,使用一组OopMap的数据结构来标记对象引用的位置。
在类加载完成的时候,HotSpot就把对象内什么偏移量上是什么类型的数据计算出来。
在JIT编译过程中,也会在特定的位置记录下栈和寄存器中哪些位置是引用。
在OopMap的协助下,HotSpot可以快速且准确地完成GC Roots枚举。
枚举根节点——确保一致性的快照——什么是安全点
OopMap内容变化的指令非常多,如果为每一条指令都生成对应的OopMap,那将会需要大量的额外空间,这样GC的空间成本将会变得很高。
实际上,HotSpot也的确没有为每条指令都生成OopMap,只是在“特定的位置”记录了这些信息,这些位置称为安全点(Safepoint),即程序执行时并非在所有地方都能停顿下来开始GC,只有在到达安全点时才能暂停。Safepoint的选定既不能太少以致于让GC等待时间太长,也不能过于频繁以致于过分增大运行时的负荷。
枚举根节点——确保一致性的快照——如何选择安全点
安全点的选定是以“是否具有让程序长时间执行的特征”为标准进行选定的——因为每条指令执行的时间都非常短暂,程序不太可能因为指令流长度太长这个原因而过长时间运行,“长时间执行”的最明显特征就是指令序列复用,例如方法调用、循环跳转、异常跳转等,所以具有这些功能的指令才会产生Safepoint。
枚举根节点——确保一致性的快照——在安全点暂停的方式
对于Sefepoint,另一个需要考虑的问题是如何在GC发生时让所有线程(这里不包括执行JNI调用的线程)都“跑”到最近的安全点上再停顿下来。
这里有两种方案可供选择:抢先式中断(Preemptive Suspension)和主动式中断(Voluntary Suspension),其中抢先式中断不需要线程的执行代码主动去配合,在GC发生时,首先把所有线程全部中断,如果发现有线程中断的地方不在安全点上,就恢复线程,让它“跑”到安全点上。现在几乎没有虚拟机实现采用抢先式中断来暂停线程从而响应GC事件。
而主动式中断的思想是当GC需要中断线程的时候,不直接对线程操作,仅仅简单地设置一个标志,各个线程执行时主动去轮询这个标志,发现中断标志为真时就自己中断挂起。轮询标志的地方和安全点是重合的,另外再加上创建对象需要分配内存的地方。
枚举根节点——确保一致性的快照——安全区域
使用Safepoint似乎已经完美地解决了如何进入GC的问题,但实际情况却并不一定。Safepoint机制保证了程序执行时,在不太长的时间内就会遇到可进入GC的Safepoint。但是,程序“不执行”的时候呢?所谓的程序不执行就是没有分配CPU时间,典型的例子就是线程处于Sleep状态或者Blocked状态,这时候线程无法响应JVM的中断请求,“走”到安全的地方去中断挂起,JVM也显然不太可能等待线程重新被分配CPU时间。对于这种情况,就需要安全区域(Safe Region)来解决。
安全区域是指在一段代码片段之中,引用关系不会发生变化。在这个区域中的任意地方开始GC都是安全的。我们也可以把Safe Region看做是被扩展了的Safepoint。在线程执行到Safe Region中的代码时,首先标识自己已经进入了Safe Region,那样,当在这段时间里JVM要发起GC时,就不用管标识自己为Safe Region状态的线程了。在线程要离开Safe Region时,它要检查系统是否已经完成了根节点枚举(或者是整个GC过程),如果完成了,那线程就继续执行,否则它就必须等待直到收到可以安全离开Safe Region的信号为止。返回搜狐,查看更多
责任编辑:
JAVA虚拟机 安全区域_JVM虚拟机如何枚举根节点:原理、安全点和安全区域相关推荐
- JVM之枚举GC Roots 根节点,安全点,安全区域。
引言 判断对象是否被回收的算法有引用计数算法和可达性分析算法. 引用计数法: 可达性分析算法:是根据GC Roots根节点作为起始点向下搜索引用链,找不到引用链则判定对象可回收. 可作为GC Roo ...
- java perm heap 区别_JVM虚拟机选项:Xms Xmx PermSize MaxPermSize区别
java虽然是自动回收内存,但是应用程序,尤其服务器程序最好根据业务情况指明内存分配限制.否则可能导致应用程序宕掉. 举例说明含义: -Xms128m 表示JVM Heap(堆内存)最小尺寸128MB ...
- 黑马 Java八股文面试题视频教程,Java面试八股文宝典(虚拟机篇)
1. JVM 内存结构 要求 掌握 JVM 内存结构划分 尤其要知道方法区.永久代.元空间的关系 结合一段 java 代码的执行理解内存划分 执行 javac 命令编译源代码为字节码 执行 java ...
- jvm根节点枚举、安全点、安全区域、记忆集、卡表、写屏障、并发的可达性分析
讲具体的实现之前,先说说几个和这些垃圾回收器息息相关的一些知识点,可以有一个更好的理解 1.根节点枚举 也就是可达性分析算法从GC Roots集合中找引用链的过程,可作为GC Roots的节点主要在全 ...
- java运行时异常与一般异常有何异同_JVM | 虚拟机运行时数据区域划分和使用详解...
引言 我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象.一个是面向过程编程以外,我们还会从底层内存管理和垃圾收集方面作出比较. 对于C++而言,程序员既要做程序 ...
- 深入理解java虚拟机 - jvm高级特性与最佳实践(第三版)_JVM虚拟机面试指南:年薪30W以上高薪岗位需求的JVM,你必须要懂!...
JVM的重要性 很多人对于为什么要学JVM这个问题,他们的答案都是:因为面试.无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎.不管是工作还是面试中,JVM都是必考题.如果不懂JVM的话,薪 ...
- Java虚拟机(一)结构原理与运行时数据区域
前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关知识,Java虚拟机也并不是三言两语能够介绍完的,因此开了Java虚拟机系列,这一篇文章我们来学习Java虚拟 ...
- JAVA开发面试题_网络_操作系统_JAVA基础_JVM虚拟机
目录 网络篇 OSI七层模型与TCP/IP 五层模型 常见应用层协议和运输层.网络层协议,以及硬件如路由器之类在哪一层 TCP与UDP区别和应用场景,基于TCP的协议有哪些,基于UDP的有哪些 TCP ...
- JAVA 文件编译执行与虚拟机(JVM)简单介绍
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...
最新文章
- YII2 实现登录时候修改最新登录时间
- FPGA篇(五)Capture导出FPGA引脚分配和端口定义
- 后台(27)——文件上传
- SQL 查询数据库中包含指定字符串的相关表和相关记录
- bytevalue_Java Number byteValue()方法与示例
- 两个3*3*n旋转矩阵在第三维相乘
- Trance — Aura NFT 合集
- 嵌入式linux gps,嵌入式Linux平台的GPS数据采集
- 曝光,程序员的 10 个摸鱼神器
- 智博通 ZBT WG2626原机编程器
- Flex for .NET platform
- 数据结构——二叉树总结
- 【Java】基于TA-Lib技术分析指标研究
- ts.to_csv('examples/tseries.csv') !type examples\tseries.csv失败的问题
- 研究生论文致谢怎么写?
- 数据库系统概论 第四章课后习题(部分)
- 杨米尔斯理论讲了什么
- Oracle TO_DATE 日期格式
- 跨境支付反洗钱业务逻辑和相关大数据分析技术实现
- 推送本地项目到gitee
热门文章
- 微信小程序实例--洗衣小程序开发经验分享
- MyBatis中动态sql语句标签详解
- System.NullReferenceException HResult=0x80004003 Message=未将对象引用设置到对象的实例。
- Vue登录注册,并保存登录状态
- python字符串变为数组_python字符串转数组
- 网络安全的昨天、今天、明天
- Win11和Ubuntu 20.04双系统配置+Ubuntu详细软件配置一遍过(Nvidia驱动、谷歌浏览器、Anaconda、Pycharm、qq、百度网盘等)
- 不用lineheight 让文字居中
- 时令变化进行养生的道理
- Spring(二)控制反转