问题一:对象跨代(区域)引用,GC Roots扫描范围如何界定?

当部分区域进行垃圾收集时,如果非收集区域的对象跨区引用了收集区域的对象(收集区域的对象A可能被非收集区域的对象静态字段B引用,这样对象A应加入GC Roots集合,防止被错误清理),虽然可以笼统的将其他所有区域都加入到GC Roots的扫描范围,可如此势必会有额外的性能消耗。
因此,HotSpot加入了记忆集(Remembered Set)来避免扫描范围过大带来的性能消耗。

问题二:记忆集是什么?

记忆集是一种用于记录非收集区域指向收集区域的指针集合的抽象数据结构。
如果不考虑成本和效率的话,最简单的实现可以用非收集区域中所有含跨代(区域)引用的对象数组来实现这个数据结构。

问题三:记忆集实现精度?

有3种实现精度,分别如下:

  1. 字长精度:每个记录精确到一个机器字长(JVM地址),表示该字包含跨代指针。
  2. 对象精度:每个记录精确到一个对象,表示该对象里有字段包含有跨代指针。
  3. 卡精度:每个记录精确到一块内存区域,表示该区域内有对象包含有跨代指针。

问题四:HotSpot虚拟机记忆集的实现时什么?

HotSpot虚拟机用一个字节数组来实现卡精度,也叫做卡表的方式实现记忆集。
卡表(card table)的每一个元素对应内存区域中一块特定的内存块,叫做卡页(card page)。
一般来说卡页大小都是2的n次幂,HotSpot中卡页大小为2的9次幂,即512字节。地址右移9位,得到的是卡表的索引序号。一个卡页的内存中通用有多个对象,但是只有卡页中有一个对象的字段存在着跨代指针,则将该卡页对应的卡表索引元素值标识为1(称为变脏),没有则标识为0。在垃圾收集发送时,只要将卡表中标识为1的对应的卡页内存块加入到GC Roots中一并扫描。

问题五:卡片元素何时变脏?

有其他分代区域中的对象引用了本区域对象时,在引用字段类型赋值的时刻将其(引用字段)对应的卡表元素变脏。
HotSpot虚拟机通过写屏障Write Barrier技术来维护卡表状态。(这里的写屏障和内存屏障无关)

问题六:写屏障是什么?

写屏障可以看着时虚拟机层面对“引用类型指端赋值”这个动作的AOP切面。在引用对象赋值是会产生一个环形(Around)通知,供程序执行额外动作。赋值前的写屏障叫写前屏障,赋值后的写屏障叫写后屏障。

问题七:卡表更新伪共享问题如何解决?

HotSpot虚拟机应用写屏障后,就会为所有赋值操作生成相应的指令,一旦收集器在写屏障中新增了更新卡表操作,就会执行卡表更新操作。而处理器缓存行多为64字节,且一个卡表元素占一个字节,所以64个卡表元素共用同一个缓存行。这64个卡表元素对应的卡页大小为32KB(64x512字节=64x2^9),也就是说如果不同线程更新的对象正好在这32KB内存区域内,就会导致更新卡表时正好写入同一个缓存行而影响性能。
为了避免伪共享问题,JDK7后HotSpot增加了-XX:+UseCondCardMark参数来开启卡表更新时判断卡表标记为过时,未过时才将其标记记为变脏。

参考资料

  • 周志明 * 《深入理解Java虚拟机》

HotSpot垃圾算法实现之记忆集与卡表和写屏障相关推荐

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

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

  2. 安全点、安全区域、记忆集、卡表与写屏障

    一.安全点(safe point) 1.1.定义 用户程序执行时并非在代码指令流的任意位置都能够停顿下来开始垃圾收集,而是强制要求必须执行到达特殊位置后才能够暂停,这些位置被称为安全点 ( Safep ...

  3. 记忆集、卡表与写屏障

    提出问题 分代收集理论的时候,会存在为了解决对象跨代引用所带来的的问题.垃圾收集器在新生代中建立啦名字为挤一挤的数据结构,用来避免把整个老年代加进GC roots扫描范围.事 实上并不只是新生代.老年 ...

  4. JVM(3)之垃圾回收(GC垃圾收集器+垃圾回收算法+安全点+记忆集与卡表+并发可达性分析......)

    <深入理解java虚拟机>+宋红康老师+阳哥大厂面试题2总结整理 一.堆的结构组成 堆位于运行时数据区中是线程共享的.一个进程对应一个jvm实例.一个jvm实例对应一个运行时数据区.一个运 ...

  5. 记忆集、卡表、G1垃圾收集器简介

    记忆集 在新生代做GCRoots可达性扫描过程中可能会碰到跨代引用的现象这种如果又去对老年代再去扫描效率太低了为此 在新生代引入记录集(Remember Set)的数据结构(记录从非收集区到收集区的指 ...

  6. 跨代引用、记忆集、卡表

    一.什么是跨代引用? 新生代中的对象持有了老年代中的对象的引用 或 老年代中的对象持有了新生代中对象的引用. 如下图所示,新生代中的A对象持有了老年代中C对象的引用:老年代中的C对象持有了新生代中B对 ...

  7. G1实现原理之记忆集与卡表

    这几天花时间完成了标记-清除算法.标记-整理算法.标记-复制算法,还算顺利.今天准备动手写G1,整理思路过程中发现G1涉及到的概念相当多而且还难以理解,网上的文章.相关书籍对相关概念的解释相对比较孤立 ...

  8. C语言链表的转置算法,c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置.doc...

    c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置 #include "stdio.h" #include "malloc.h" /*typedef s ...

  9. Hotspot细节实现安全区域、记忆集卡表

    Hotspot细节实现 文章目录 Hotspot细节实现 3.安全区域 产生原因 安全区域概念 实现过程 4.记忆集与卡表 产生原因: 记忆集概念 实现过程: 卡精度(卡表) 3.安全区域 产生原因 ...

最新文章

  1. keras中的fit函数参数_keras的fit_generator与callback函数
  2. openstack用rdo方式安装时遇到的问题
  3. Java HashMap的put操作(Java1.8)
  4. 关于《设计模式》这本书(三)——Proxy模式
  5. oracle 方言报错,ORACLE11g:No Dialect mapping for JDBC type: -9解决方案详解
  6. k8s实践7:ipvs结合iptables使用过程分析
  7. 使用url参数传递SAP Analytics Cloud filter的一个例子
  8. ARC122C-Calculator【乱搞,构造】
  9. springboot增删改查案例_大神基于SpringBoot开发一个Restful服务,实现增删改查功能...
  10. 你还在为查询滑动窗口最大值发愁吗?点开看最高效率解法!
  11. 如何枚举String类型的枚举?
  12. MVG 为 SGS 提供汽车天线测量和 OTA 测试设备
  13. pentaho发布报表后免登陆查看数据报表
  14. android studio出现,Android studio 出现缺少sdk的情况,如何解决?
  15. 基于微信小程序电影交流平台源码成品(微信小程序毕业设计)
  16. EM算法原理和python简单实现
  17. Mobius反演方法
  18. 计算机硬件的配置的图片,鲁大师怎么生成电脑配置图
  19. Flink使用connect实现双流join全外连接
  20. [fielddata] Data too large, data for [_id] would be [13181907968/12.2gb]

热门文章

  1. NLP笔记:word2vec简单考察
  2. win10系统局域网连接网络连接到服务器失败,Win10局域网内共享失败如何解决
  3. 手把手教你如何让电脑将SD卡/U盘识别为本地磁盘
  4. To run a command as adninistrator (user “root“), use “sudo <command>“.see “man sudo_root“ for detail
  5. 淘宝一键铺货上传商品API对接文档
  6. 【运维面试】笔试题中最常见的高频问题-搞会你就不怕笔试了
  7. PCI简易通讯控制器,到底用什么驱动呢?实践证明
  8. ET学习笔记之五星麻将0
  9. Computop支付网关(一) credit Card
  10. 我,29岁,985本科,互联网企业程序员,晒晒我的真实年薪