Eiffel 并发垃圾回收

Eiffel concurrent garbage collection

谁能解释一下并发垃圾回收是如何在 eiffel 中实现的? 我发现的是有关顺序程序垃圾收集的详细信息: - 代清理 - 标记和扫描 - 内存压缩

Eiffel 是否以不同方式处理并发(使用 SCOOP)垃圾回收? 使用 SCOOP,堆被划分为每个单独对象的区域。释放特定对象的标准是什么?

支持 SCOOP 的垃圾收集器与常规垃圾收集器的主要区别在于,它不仅会删除对象,还会释放 SCOOP processors/regions。从根集开始跟踪活动对象,包括可从调用堆栈访问的对象和一次函数结果。第一个(调用堆栈)是无条件的,即始终包含在根集中,因为相应的对象涉及某些计算。第二个(一次函数结果)是有条件的,因为只有当相应的 processor/region 也可到达时才应考虑它们。因此,GC 应该同时跟踪活动对象和活动 processors/regions.

当 processor/region 变得不可访问时,应释放关联的线程和资源。因此,垃圾收集器释放的不仅仅是内存,还有计算能力。鉴于活动对象和活动 processors/regions 是相互依赖的,该算法为活动对象和活动 processors/regions 计算一个不动点。这与传统的 GC 不同,后者仅为活动对象计算固定点。在这个计算之后,SCOOP-aware GC 回收死对象和死处理器。可以在论文 "Processors and Their Collection".

中找到带有一些基准的算法的详细描述

关于对象垃圾回收,EiffelStudio 中的实现目前使用您提到的算法:分代清理、标记和清除、传统适应多线程的内存压缩,当对已处理对象的写入被记录并纳入时GC 的帐户。