学习JVM之垃圾收集06——记忆集和卡表(HotSpot)
记忆集
记忆集有什么作用
这里谈记忆集,是为了解决跨代引用带来的问题。
只针对新生代的收集(Minor GC),如果有老年代的对象引用新生的对象怎么办呢?把整个老年代检查一遍是可以,但是这样做很不值得。于是记忆集出现了。
记忆集是什么
记录从非收集区域指向收集区域的指针集合的抽象数据结构。
记忆集的实现(卡表)
如上所说,记忆集是一个抽象的数据结构,需要一个对应的具体实现。
大致思考一下,可以建立一个数组,存放所有非收集区域中有跨代引用的对象。
虚拟机觉得这样做开销太大,没有必要。收集器只需要知道某一块非收集区域是否存在指向收集区域的指针就可以了。所以,虚拟机才用了更加粗犷的粒度,比如字长精度(一个机器字长)。
当然对象精度也是可以,但是并不是像上边说的建立对象数组,而是存放是否有跨代指针的一个标记。
还有就是卡精度。表示每个记录精确到一块内存区域,该区域内有对象包含跨代指针。使用卡精度实现记忆集的数据结构叫做卡表。
卡表
在HotSpot中,卡表是一个字节数组。卡表中的每个元素对应其标识内存区域的一块特定大小的内存。这一块内存叫卡页。HotSpot的卡页是512字节。只要一个卡页中有一个对象存在跨代引用,就将对应卡表的数组元素的值标识为1,称为元素变脏。没有就为0。
在垃圾收集时,筛选出卡表里的脏元素,把他们加入GC Roots一并扫描。
这一篇就到这里了。
早睡早起,注意身体。早起之王祝你一日千里
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
实现update批量更新多个字段多条记录