• 满分💯
    2021-12-29
    「因为 Evacation 发生的时机是不确定的,在并发标记阶段也可能发生」如果并发标记没有结束,nextBitMap 可以赋值给 prevBitMap吗?那是怎么保证 Evacation 开始的时候 prevBitMap 可用的呢?

    作者回复: 实际上bitmap不存在也是可以的。使用DFS也足够保证Evacuation的过程是正确的。那么bitmap的作用除了计算垃圾的比例,还有就是可以加速跨region的引用的对象活跃性判断。从这个角度看,prevBitMap只要有就能加速转移的过程,哪怕它只是描述一部分空间内的对象是否活跃。当Evacuation开始时,prevBitMap有多少就用多少好了。prevTAMS到top之间的对象都交给DFS去处理就行了。

    
    2
  • csyangchsh
    2021-12-31
    老师,对下面这句话,我有一个疑问,Mixed GC CSet的确定是应该在并发标记后根据region的垃圾对象的比例选择的,那么在这之前如何知道哪些region在CSet中?对于YGC来说,所有Old -> Young的引用都要记录吧。这个地方是不是应该改成“老年代 Region 到年轻代 Region 的引用, 和老年代 Region 到 老年代 Region 的引用。”? “RSet 需要维护的引用关系只有两种,非 CSet 老年代 Region 到年轻代 Region 的引用,和非 CSet 老年代 Region 到 CSet 老年代 Region 的引用。”

    作者回复: 你的想法是对的。一开始CSet是空的,所以所有的老年代Region都不属于CSet。随着标记的进行,一些老年代Region的垃圾比例超过一定阈值就会被添加到CSet中,那么从它出发的引用就不用再管了。所以CSet的构建并不是一下子完成的。这样有助于提高效率。

    
    
  • Alexyz
    2021-12-28
    老师,采用SATB设计解决了漏标的问题,但会不会将本来可能是需要被回收的对象错标了呢?如果会,G1怎么解决的这种情况呢?

    作者回复: 这不就是多标么。多标会产生浮动垃圾,但下一次会被回收掉。原文中有的,可以再仔细读读

    
    
  • 费城的二鹏
    2021-12-19
    老师没有讲,哪些部分是stw的,感觉 Evacation 应该是 stw 的。 思考题:从最大停顿时间角度考虑,需要尽量全部操作并发,root扫描目前很难并发,所以接下来应该是解决并发copy的难点,实现减少最大停顿时间。

    作者回复: 是的。目前讲到的内容来说,evac阶段都是stw的,下节课才讲如何在copy阶段也可以并发。

    
    
  • 李二木
    2021-12-17
    Garbage First原来是指老年代 Region 的垃圾占比高,就有可能优先被回收。因为年轻代是全部回收。

    作者回复: 对的。

    
    
  • Geek_825682
    2023-06-01 来自北京
    引用消失--》write barrier标记灰色--》业务线程执行,增加耗时--》空间换时间--》SATB队列。
    
    
  • Spoon
    2023-01-21 来自浙江
    RSet里面存放的数据 1.稀疏表是一个哈希表,存放的是Card,哈希表的Key是引用关系吗? 2.细粒度表则是一个真正的 card table,引用当前Region的Region的Card table? 3.粗粒度表则是一个区的位图,是不是将所有Region做成bitmap?
    
    
  • 李二木
    2022-05-23
    G1回收算法只是选择复制算法吗?
    
    
  • 满分💯
    2022-02-24
    1. prevBitMap 中记录的应该是活跃对象起始地址吧,但是怎确定对象的大小呢?难道是按照固定块大小搬移对象的吗? 2. G1 中对象的分配应该是基于空闲链表分配对象的吧,垃圾回收的时候是不是把回收的region归还到空闲链表中。
    
    