这个问题想了很久,脑子想迷糊了都,不知道理解得对不对。
在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这个状态。
分享到:
相关推荐
例如,HotSpot的垃圾收集器在JDK7中包括了Serial、Parallel、Concurrent Mark Sweep (CMS)和Garbage First (G1)等多种类型。通过阅读源码,我们可以学习到如何设计和实现高效、低延迟的内存管理策略。CMS收集器采用...
本指南主要涵盖了垃圾收集器的优化目标、策略以及各种实现,旨在帮助开发者更好地理解如何调整 JVM 参数以满足特定的需求。 优化目标与策略(Ergonomics) Java HotSpot VM 提供了两种主要的优化目标:最大暂停时间...
2. **垃圾收集器(Garbage Collectors)**:HotSpot支持多种GC策略,如Parallel GC、Concurrent Mark Sweep (CMS) 和G1。JDK10的G1 Full GC并行化是HotSpot的一个重要改进。 3. **内存模型(Memory Model)**:...
6. -XX:+UseConcMarkSweepGC和-XX:+UseParallelGC:选择垃圾收集器,前者为CMS收集器,后者为并行收集器。 7. -XX:+UseG1GC:启用G1垃圾收集器,一种更先进的垃圾回收机制,旨在减少停顿时间。 8. -XX:HeapDumpPath...
包含参数如下: 1. 内存管理参数 2. 及时编译参数 3. 类型加载参数 4. 多线程相关参数‘ 5. 性能参数 6. 调试参数
JDK9作为Java发展历程中的一个重要版本,引入了多项创新性改进,其中包括对HotSpot虚拟机的优化和增强。HotSpot虚拟机是Oracle JDK的核心部分,负责运行Java应用程序,而其内部涉及到的C++源码则是实现高性能的关键...
3. 垃圾收集器:HotSpot提供了多种垃圾收集器,如Serial、Parallel、CMS和G1。这些垃圾收集器各有优缺点,适应不同的应用场景。源码中可以看到它们的实现细节,包括内存分配、垃圾识别和回收策略等。 4. 类加载系统...
HSDis工具是Java HotSpot虚拟机的一个重要组成部分,主要用于帮助开发者理解JIT(Just-In-Time)编译器的工作原理。HotSpot虚拟机是Oracle JDK和OpenJDK中的默认虚拟机,它通过动态编译技术提高了Java应用程序的运行...
文档接下来介绍J2SE 5.0 HotSpot JVM中的垃圾收集器,包括垃圾收集器的类型、快速分配、串行收集器、并行收集器、并行压缩收集器和并发标记-清除(CMS)收集器。此外,还探讨了自动选择收集器、堆大小和虚拟机的行为...
《HotSpot虚拟机对象探秘》是一份详细探讨Java虚拟机内部对象创建、内存布局以及访问定位的资源。这份资料采用Xmind脑图的形式,旨在帮助读者深入理解JVM的底层原理,尤其聚焦于HotSpot虚拟机。内容涵盖对象实例化、...
HotSpot 虚拟机中的垃圾收集参数可以通过命令行选项或 JVM 选项来设置。常见的垃圾收集参数包括: * -Xms:设置初始堆大小 * -Xmx:设置最大堆大小 * -XX:NewSize:设置 young generation 的大小 * -XX:MaxNewSize...
VM是虚拟机的规范,HotSpot是jvm的具体实现。...HotSpot对bytecode的编译不是在程序运行前编译的,而是在程序运行过程中编译的。 HotSpot里运行着一个监视器(Profile Monitor),用来监视程序的运行状况。
Java HotSpot虚拟机提供了垃圾收集器监控功能,用于实时监控垃圾收集器的活动信息。使用 `-XX:+UseGCLog`选项来启用垃圾收集器监控。 结论 Java HotSpot虚拟机提供了多种垃圾收集算法和调整选项,满足不同应用场景...
4. **垃圾收集算法**:HotSpot支持多种垃圾收集器,如Serial、Parallel、CMS(Concurrent Mark Sweep)、G1(Garbage-First)和ZGC(Z Garbage Collector)。每种收集器有其特定的设计目标和适用场景,书里会对比...
本文将对 JDK11 HotSpot 虚拟机垃圾收集调整指南进行详细解析,涵盖垃圾收集机制、垃圾收集器类型、垃圾收集调整参数等知识点。 垃圾收集机制 在 Java 应用程序中,垃圾收集机制是指虚拟机自动 回收无用对象的过程...
HotSpot正是目前世界上java虚拟机的最好的实现。 HotSpot的基础代码是许多人辛勤劳动的结晶,这个过程迄今已持续了超过10年的时间(当然时间长并不意味着一定好,一半一半吧)。所以到现在为止,他的体积是很大的。...
### 性能工程师指南:玩转OpenJDK HotSpot垃圾收集器 #### 一、性能工程概述 在软件开发过程中,性能工程是一个重要的环节,它不仅涵盖了对软件性能的需求定义与测试计划制定,还包括了软件的开发、实施及后续的...