原标题: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虚拟机如何枚举根节点:原理、安全点和安全区域相关推荐

  1. JVM之枚举GC Roots 根节点,安全点,安全区域。

    引言  判断对象是否被回收的算法有引用计数算法和可达性分析算法. 引用计数法: 可达性分析算法:是根据GC Roots根节点作为起始点向下搜索引用链,找不到引用链则判定对象可回收. 可作为GC Roo ...

  2. java perm heap 区别_JVM虚拟机选项:Xms Xmx PermSize MaxPermSize区别

    java虽然是自动回收内存,但是应用程序,尤其服务器程序最好根据业务情况指明内存分配限制.否则可能导致应用程序宕掉. 举例说明含义: -Xms128m 表示JVM Heap(堆内存)最小尺寸128MB ...

  3. 黑马 Java八股文面试题视频教程,Java面试八股文宝典(虚拟机篇)

    1. JVM 内存结构 要求 掌握 JVM 内存结构划分 尤其要知道方法区.永久代.元空间的关系 结合一段 java 代码的执行理解内存划分 执行 javac 命令编译源代码为字节码 执行 java ...

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

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

  5. java运行时异常与一般异常有何异同_JVM | 虚拟机运行时数据区域划分和使用详解...

    引言   我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象.一个是面向过程编程以外,我们还会从底层内存管理和垃圾收集方面作出比较.   对于C++而言,程序员既要做程序 ...

  6. 深入理解java虚拟机 - jvm高级特性与最佳实践(第三版)_JVM虚拟机面试指南:年薪30W以上高薪岗位需求的JVM,你必须要懂!...

    JVM的重要性 很多人对于为什么要学JVM这个问题,他们的答案都是:因为面试.无论什么级别的Java从业者,JVM都是进阶时必须迈过的坎.不管是工作还是面试中,JVM都是必考题.如果不懂JVM的话,薪 ...

  7. Java虚拟机(一)结构原理与运行时数据区域

    前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关知识,Java虚拟机也并不是三言两语能够介绍完的,因此开了Java虚拟机系列,这一篇文章我们来学习Java虚拟 ...

  8. JAVA开发面试题_网络_操作系统_JAVA基础_JVM虚拟机

    目录 网络篇 OSI七层模型与TCP/IP 五层模型 常见应用层协议和运输层.网络层协议,以及硬件如路由器之类在哪一层 TCP与UDP区别和应用场景,基于TCP的协议有哪些,基于UDP的有哪些 TCP ...

  9. JAVA 文件编译执行与虚拟机(JVM)简单介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...

最新文章

  1. YII2 实现登录时候修改最新登录时间
  2. FPGA篇(五)Capture导出FPGA引脚分配和端口定义
  3. 后台(27)——文件上传
  4. SQL 查询数据库中包含指定字符串的相关表和相关记录
  5. bytevalue_Java Number byteValue()方法与示例
  6. 两个3*3*n旋转矩阵在第三维相乘
  7. Trance — Aura NFT 合集
  8. 嵌入式linux gps,嵌入式Linux平台的GPS数据采集
  9. 曝光,程序员的 10 个摸鱼神器
  10. 智博通 ZBT WG2626原机编程器
  11. Flex for .NET platform
  12. 数据结构——二叉树总结
  13. 【Java】基于TA-Lib技术分析指标研究
  14. ts.to_csv('examples/tseries.csv') !type examples\tseries.csv失败的问题
  15. 研究生论文致谢怎么写?
  16. 数据库系统概论 第四章课后习题(部分)
  17. 杨米尔斯理论讲了什么
  18. Oracle TO_DATE 日期格式
  19. 跨境支付反洗钱业务逻辑和相关大数据分析技术实现
  20. 推送本地项目到gitee

热门文章

  1. 微信小程序实例--洗衣小程序开发经验分享
  2. MyBatis中动态sql语句标签详解
  3. System.NullReferenceException HResult=0x80004003 Message=未将对象引用设置到对象的实例。
  4. Vue登录注册,并保存登录状态
  5. python字符串变为数组_python字符串转数组
  6. 网络安全的昨天、今天、明天
  7. Win11和Ubuntu 20.04双系统配置+Ubuntu详细软件配置一遍过(Nvidia驱动、谷歌浏览器、Anaconda、Pycharm、qq、百度网盘等)
  8. 不用lineheight 让文字居中
  9. 时令变化进行养生的道理
  10. Spring(二)控制反转