jvm的card table数据结构

jvm系列

  • 垃圾回收基础

  • JVM的编译策略

  • GC的三大基础算法

  • GC的三大高级算法

  • GC策略的评价指标

  • JVM信息查看

  • GC通用日志解读

  • jvm的card table数据结构

  • Java类初始化顺序

  • Java对象结构及大小计算

  • Java的类加载机制

  • Java对象分配简要流程

  • 年老代过大有什么影响

  • Survivor空间溢出实例

  • 关于Object=null

  • Java线程与Xss

作用

为了支持高频率的新生代的回收,虚拟机使用一种叫做卡表(Card Table)的数据结构,卡表作为一个比特位的集合,每一个比特位可以用来表示年老代的某一区域中的所有对象是否持有新生代对象的引用。

jvm的card table数据结构_第1张图片

这样新生代在GC时,可以不用花大量的时间扫描所有年老代对象,来确定每一个对象的引用关系,而可以先扫描卡表,只有卡表的标记位为1时,才需要扫描给定区域的年老代对象。而卡表位为0的所在区域的年老代对象,一定不包含有对新生代的引用。

jvm的card table数据结构_第2张图片

卡表中每一个位表示年老代4K的空间,卡表记录未0的年老代区域没有任何对象指向新生代,只有卡表位为1的区域才有对象包含新生代引用,因此在新生代GC时,只需要扫描卡表位为1所在的年老代空间。使用这种方式,可以大大加快新生代的回收速度。

jvm的card table数据结构_第3张图片

结构

卡表是个单字节数组,每个数组元素对应堆中的一张卡。

jvm的card table数据结构_第4张图片

每次年老代对象中某个引用新生代的字段发生变化时,Hotspot VM就必须将该卡所对应的卡表元素设置为适当的值,从而将该引用字段所在的卡标记为脏。在Minor GC过程中,垃圾收集器只会在脏卡中扫描查找年老代-新生代引用。

jvm的card table数据结构_第5张图片

Hotspot VM的字节码解释器和JIT编译器使用写屏障维护卡表。写屏障是一小段将卡状态设置为脏的代码。解释器每次执行更新引用的字节码时,都会执行一段写屏障,JIT编译器在生成更新引用的代码后,也会生成一段写屏障。虽然写屏障使得应用线程增加了一些性能开销,但Minor GC变快了许多,整体的垃圾收集效率也提高了许多,通常应用的吞吐量也会有所改善。

你可能感兴趣的:(jvm)