`
chaisencs
  • 浏览: 8342 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

谈一下对hotspot虚拟机中CMS收集器要设置Mod Union Table的理解

阅读更多
这个问题想了很久,脑子想迷糊了都,不知道理解得对不对。

在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这个状态。


分享到:
评论

相关推荐

    JDK7底层C++源码及hotspot虚拟机源码

    例如,HotSpot的垃圾收集器在JDK7中包括了Serial、Parallel、Concurrent Mark Sweep (CMS)和Garbage First (G1)等多种类型。通过阅读源码,我们可以学习到如何设计和实现高效、低延迟的内存管理策略。CMS收集器采用...

    【译】Java 14 Hotspot 虚拟机垃圾回收调优指南(csdn)————程序.pdf

    本指南主要涵盖了垃圾收集器的优化目标、策略以及各种实现,旨在帮助开发者更好地理解如何调整 JVM 参数以满足特定的需求。 优化目标与策略(Ergonomics) Java HotSpot VM 提供了两种主要的优化目标:最大暂停时间...

    JDK10(JDK10底层C++源码及hotspot虚拟机源码)

    2. **垃圾收集器(Garbage Collectors)**:HotSpot支持多种GC策略,如Parallel GC、Concurrent Mark Sweep (CMS) 和G1。JDK10的G1 Full GC并行化是HotSpot的一个重要改进。 3. **内存模型(Memory Model)**:...

    Java HotSpot虚拟机的部分参数翻译

    6. -XX:+UseConcMarkSweepGC和-XX:+UseParallelGC:选择垃圾收集器,前者为CMS收集器,后者为并行收集器。 7. -XX:+UseG1GC:启用G1垃圾收集器,一种更先进的垃圾回收机制,旨在减少停顿时间。 8. -XX:HeapDumpPath...

    HotSpot虚拟机主要参数表

    包含参数如下: 1. 内存管理参数 2. 及时编译参数 3. 类型加载参数 4. 多线程相关参数‘ 5. 性能参数 6. 调试参数

    JDK9源码(底层C++源码及hotspot虚拟机源码)

    JDK9作为Java发展历程中的一个重要版本,引入了多项创新性改进,其中包括对HotSpot虚拟机的优化和增强。HotSpot虚拟机是Oracle JDK的核心部分,负责运行Java应用程序,而其内部涉及到的C++源码则是实现高性能的关键...

    JDK6底层C++源码及hotspot虚拟机源码

    3. 垃圾收集器:HotSpot提供了多种垃圾收集器,如Serial、Parallel、CMS和G1。这些垃圾收集器各有优缺点,适应不同的应用场景。源码中可以看到它们的实现细节,包括内存分配、垃圾识别和回收策略等。 4. 类加载系统...

    hsdis工具,hotspot虚拟机插件,反汇编jit编译代码

    HSDis工具是Java HotSpot虚拟机的一个重要组成部分,主要用于帮助开发者理解JIT(Just-In-Time)编译器的工作原理。HotSpot虚拟机是Oracle JDK和OpenJDK中的默认虚拟机,它通过动态编译技术提高了Java应用程序的运行...

    官方HotSpot内存管理文档

    文档接下来介绍J2SE 5.0 HotSpot JVM中的垃圾收集器,包括垃圾收集器的类型、快速分配、串行收集器、并行收集器、并行压缩收集器和并发标记-清除(CMS)收集器。此外,还探讨了自动选择收集器、堆大小和虚拟机的行为...

    HotSpot虚拟机对象探秘-xmind脑图pdf

    《HotSpot虚拟机对象探秘》是一份详细探讨Java虚拟机内部对象创建、内存布局以及访问定位的资源。这份资料采用Xmind脑图的形式,旨在帮助读者深入理解JVM的底层原理,尤其聚焦于HotSpot虚拟机。内容涵盖对象实例化、...

    JDK17-hotspot-virtual-machine-garbage-collection-tuning-guid

    HotSpot 虚拟机中的垃圾收集参数可以通过命令行选项或 JVM 选项来设置。常见的垃圾收集参数包括: * -Xms:设置初始堆大小 * -Xmx:设置最大堆大小 * -XX:NewSize:设置 young generation 的大小 * -XX:MaxNewSize...

    Hotspot 虚拟机源码 jdk8u

    VM是虚拟机的规范,HotSpot是jvm的具体实现。...HotSpot对bytecode的编译不是在程序运行前编译的,而是在程序运行过程中编译的。 HotSpot里运行着一个监视器(Profile Monitor),用来监视程序的运行状况。

    JDK19-hotspot-virtual-machine-garbage-collection-tuning-guide

    Java HotSpot虚拟机提供了垃圾收集器监控功能,用于实时监控垃圾收集器的活动信息。使用 `-XX:+UseGCLog`选项来启用垃圾收集器监控。 结论 Java HotSpot虚拟机提供了多种垃圾收集算法和调整选项,满足不同应用场景...

    《HotSpot实战》

    4. **垃圾收集算法**:HotSpot支持多种垃圾收集器,如Serial、Parallel、CMS(Concurrent Mark Sweep)、G1(Garbage-First)和ZGC(Z Garbage Collector)。每种收集器有其特定的设计目标和适用场景,书里会对比...

    JDK11-hotspot-virtual-machine-garbage-collection-tuning-guide

    本文将对 JDK11 HotSpot 虚拟机垃圾收集调整指南进行详细解析,涵盖垃圾收集机制、垃圾收集器类型、垃圾收集调整参数等知识点。 垃圾收集机制 在 Java 应用程序中,垃圾收集机制是指虚拟机自动 回收无用对象的过程...

    Hotspot VM源码

    HotSpot正是目前世界上java虚拟机的最好的实现。 HotSpot的基础代码是许多人辛勤劳动的结晶,这个过程迄今已持续了超过10年的时间(当然时间长并不意味着一定好,一半一半吧)。所以到现在为止,他的体积是很大的。...

    性能工程师指南:玩转OpenJDK HotSpot垃圾收集器

    ### 性能工程师指南:玩转OpenJDK HotSpot垃圾收集器 #### 一、性能工程概述 在软件开发过程中,性能工程是一个重要的环节,它不仅涵盖了对软件性能的需求定义与测试计划制定,还包括了软件的开发、实施及后续的...

Global site tag (gtag.js) - Google Analytics