这个问题想了很久,脑子想迷糊了都,不知道理解得对不对。
在CMS的并发标记阶段,可能会出现两个并发问题:
第一,CMS在执行并发标记,同时,应用在修改老年代中对象的引用。这时候,老年代的引用状态会发生改变,所以CMS要想办法把这种改变记录下来。CMS使用card table来记录这些改变,把发生改变的对象所在的card标记为dirty,然后在最终标记阶段再次扫描这些标记为dirty的card。(不过这样也会产生浮动垃圾)
第二,CMS在执行并发标记,同时,新生代GC开始运行。注意,新生代GC也需要扫描上述的card table(据我理解这个card table只有一个),在扫描的时候,也是要对标记为dirty(这里的dirty是在引用赋值的时候标记的,具体是先插入一个write barrier,然后判断如果左值是老年代的引用,右值是新生代的引用,那么就把这个card标记为dirty)的card进行分析,如果这个card没有对新生代的引用了,那么新生代GC就会把它标记为clean,但是这样导致CMS收集器在最终标记阶段无法扫描这个card。
那这样到底有影响吗?想象一种可能的情况,就是在CMS在执行并发标记的时候,其他线程先改变了一个card里面的对象引用,然后新生代GC开始运行(这时CMS仍然在执行并发标记),新生代GC如果扫描到这个dirty card不再有新生代的引用,那么就把它标记为clean。这个时候就会出现了标记遗漏的情况了。
为了解决上述的问题,Mod Union Table被引入了,它是一个位向量,每个单元的大小只有1位,每个单元对应一个card(card的大小是512字节,cardtable每一个单元的大小是1个字节),在新生代GC处理dirty card之前,先把该card在Mod Union Table里面的对应项置位。这样,CMS在执行最终标记阶段的时候,就会扫描Mod Union Table和card table里面被标记的项。
另外,对于card table中每一个单元的取值,新生代GC和CMS所设置的dirty应该有所区别,意思就是说,它们两个用不同的值来代表drity这个状态。
分享到:
相关推荐
包含参数如下: 1. 内存管理参数 2. 及时编译参数 3. 类型加载参数 4. 多线程相关参数‘ 5. 性能参数 6. 调试参数
【译】Java 14 Hotspot 虚拟机垃圾回收调优指南(csdn)————程序
JDK7底层C++源码及hotspot虚拟机源码
JDK10(JDK10底层C++源码及hotspot虚拟机源码)
资源描述: 1.HotSpot虚拟机对象探秘-xmind脑图pdf 2.资源内容:HotSpot虚拟机对象探秘 3.学习目标:了解jvm底层原理 4.特点:简单易懂,容易上手 5.使用说明:需要使用pdf打开
JDK6底层C++源码及hotspot虚拟机源码
JDK9源码(底层C++源码及hotspot虚拟机源码)
HotSpot正是目前世界上java虚拟机的最好的实现。 HotSpot的基础代码是许多人辛勤劳动的结晶,这个过程迄今已持续了超过10年的时间(当然时间长并不意味着一定好,一半一半吧)。所以到现在为止,他的体积是很大的。...
Java_HotSpot虚拟机的内存管理.pdf
编译好的dll文件,hotspot虚拟机插件,反汇编jit编译代码
字节码的编译原理、字节码的内部组成结构、通过源码的方式剖析HotSpot VM 的启动过程和初始化过程、Java 虚拟机的运行时内存、垃圾收集算法、垃圾收集器(重点讲解了Serial 收集器、ParNew 收集器、Parallel 收集器...
NULL 博文链接:https://caoxudong818.iteye.com/blog/1214133
Cache、Perf Data、Crash 分析方法、转储分析方法、 垃圾收集器的设计演进、CMS 和 G1 收集器、栈、JVM 对硬件寄存器的利用、栈顶缓存技术、解释器、字节 码表、转发表、Stubs、Code Cache、Code 生成器、JIT 编译器...
字节码的编译原理、字节码的内部组成结构、通过源码的方式剖析HotSpot VM 的启动过程和初始化过程、Java 虚拟机的运行时内存、垃圾收集算法、垃圾收集器(重点讲解了Serial 收集器、ParNew 收集器、Parallel 收集器...
《HotSpot实战》深入浅出地讲解了HotSpot虚拟机的工作原理,将隐藏在它内部的本质内容逐一呈现在读者面前,包括OpenJDK与HotSpot项目、编译和调试HotSpot的方法、HotSpot内核结构、Launcher、OOP-Klass对象表示系统...
字节码的编译原理、字节码的内部组成结构、通过源码的方式剖析HotSpot VM 的启动过程和初始化过程、Java 虚拟机的运行时内存、垃圾收集算法、垃圾收集器(重点讲解了Serial 收集器、ParNew 收集器、Parallel 收集器...
对象的创建加载:先去检测new指令能否再常量池中定位到一个类的符号引用,如果未被加载、解析、初始化过 执行相应的类加载过程分配内存: 为对象分配空间时采用指针碰
学习JDK 源码必备,提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机。 但不一定所有人都知道的是,这个目前看起来“血统纯正”的虚拟机在最初...