240 发简信
IP属地:重庆
  • 【思考🤔】CardTable与mod-union table有什么关系,都是干什么的?
    这个问题是这样的,在分代垃圾回收时,跨代引用是要考虑的,比如young gc时老年代对象B引用年轻代的对象A,这个老年代对象B就被称为假根。hotspot是这样处理的,它把堆内存分为card的集合,一个card是512B,然后用一个全局的卡表来记录引用的变化。就比如卡表中的一个字节用来对应堆上的一个card是否存在跨代引用。B对象所在的card在全局卡表上对应字节标记为dirty就说明这个card存在跨代引用。而cms为了处理漏标的情况,也会记录引用关系的变化(比如黑对象指向了白对象)同样记录在card table中。这个card table只有一份既要用来支持young GC又要用来支持CMS。每次young GC过程中都涉及重置和重新扫描card table。那岂不是cms所需引用关系就没有了,所以又产生了一个mod-union table(一个bit对应一个card)用来在CMS concurrent marking正在运行的过程中,每当发生一次young GC,当youngGC要重置card table里的某个记录时,将card table的记录更新到mod union table中,这样在重新标记时card table外加mod-union table就足以记录在并发标记过程中old gen发生的所有引用变化了。

    jvm 优化篇-(8)-跨代引用问题(RememberSet、CardTable、ModUnionTable、DirtyCard)

    1、什么是跨代引用? 红色的线表示由虚拟机栈中发出的引用。显然B--->A、E--->F都是跨代引用。 2、跨代引用对MonitorGC的影响 JVM GC 判断对象是否可以...

  • 【思考🤔】既然initial mark阶段+concurrent mark阶段已经扫果了young gen 为何还要再次Remark?
    这个问题你可以考虑这种情况,如果remark阶段不重新扫描young gen,那么young gc发生时(old gc发生的同时young gc也是可以发生的)年轻代有对象gc年龄到了,晋升到老年代,如果不重新标记,那么这个对象是不是就被漏标了呢。

    jvm 优化篇-(8)-跨代引用问题(RememberSet、CardTable、ModUnionTable、DirtyCard)

    1、什么是跨代引用? 红色的线表示由虚拟机栈中发出的引用。显然B--->A、E--->F都是跨代引用。 2、跨代引用对MonitorGC的影响 JVM GC 判断对象是否可以...