J中国 2019-10-28 10:13 采纳率: 0%
浏览 134

CMS垃圾回收中的 sweep阶段感觉不能称为真正的并发?

cms中的sweep阶段写的是" After the remark pause, a concurrent sweeping phase collects the objects identified as unreachable. "但我看代码中sweep阶段需要三把锁“CMS token(禁止stw回收);freelistLock(禁止在本堆分配);bitMapLock(禁止访问修改bitmap)”如下图。如果sweep时持有这三把锁,那这与stw有什么区别吗?那还不如用lazy-sweep?

图片说明

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-29 21:06
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    CMS的Sweep阶段确实可以被视为一个并发操作,但是它的实现方式和普通的线程同步机制不同。在Sweep阶段,CMS会使用一种特殊的同步机制来管理内存的回收。

    具体来说,CMS会在每次Sweep阶段开始之前,先进行一个叫作"Token Synchronization"的过程。这个过程会确保所有正在执行Sweep操作的线程都拥有同一个CMS Token,从而保证了回收过程中不会发生数据竞争问题。同时,这种同步机制也会阻止其他线程进入回收区,防止它们对已回收的数据造成影响。

    此外,在Sweep阶段结束之后,CMS还会进行一次清理工作,叫做"intra-sweep cleanup"。这个清理过程会释放掉一些不必要的资源,比如已经回收但还未被使用的对象。这些清理工作也需要通过某种形式的同步来完成。

    因此,虽然Sweep阶段看起来像是简单的线程同步操作,但实际上它包含了复杂的同步策略,以保证回收过程的安全性和一致性。

    评论

报告相同问题?