【发布时间】:2018-12-11 23:39:55
【问题描述】:
谁能解释一下 eiffel 中的并发垃圾回收是如何实现的? 我发现的是有关顺序程序垃圾收集的详细信息: - 一代清理 - 标记和扫描 - 内存压缩
Eiffel 是否以不同方式处理并发(使用 SCOOP)垃圾收集? 使用 SCOOP 将堆划分为每个单独对象的区域。解除分配特定对象的标准是什么?
【问题讨论】:
标签: concurrency garbage-collection eiffel
谁能解释一下 eiffel 中的并发垃圾回收是如何实现的? 我发现的是有关顺序程序垃圾收集的详细信息: - 一代清理 - 标记和扫描 - 内存压缩
Eiffel 是否以不同方式处理并发(使用 SCOOP)垃圾收集? 使用 SCOOP 将堆划分为每个单独对象的区域。解除分配特定对象的标准是什么?
【问题讨论】:
标签: concurrency garbage-collection eiffel
识别 SCOOP 的垃圾收集器与常规垃圾收集器的主要区别在于,它不仅会删除对象,还会释放 SCOOP 处理器/区域。从根集开始跟踪活动对象,其中包括可从调用堆栈访问的对象和一次函数结果。第一个(调用堆栈)是无条件的,即始终包含在根集中,因为相应的对象涉及某些计算。第二个(一次函数结果)是有条件的,因为只有在相应的处理器/区域也可以到达时才应该考虑它们。因此,GC 应该跟踪活动对象和活动处理器/区域。
当一个处理器/区域变得不可访问时,相关的线程和资源应该被释放。因此,垃圾收集器不仅释放内存,还释放计算能力。鉴于活动对象和活动处理器/区域是相互依赖的,该算法计算活动对象和活动处理器/区域的固定点。这与只为活动对象计算固定点的传统 GC 不同。在这个计算之后,SCOOP 感知的 GC 回收死对象和死处理器。可以在论文“处理器及其集合”中找到该算法的详细描述以及一些基准。
关于对象垃圾收集,EiffelStudio中的实现目前使用您提到的算法:分代清除,标记和清除,内存压缩与传统适应多线程,当写入已经处理的对象被记录并考虑到GC。
【讨论】: