这有什么错标记和清除的GC?(What's wrong with mark-and-swee

2019-08-31 14:44发布

我在读史蒂夫·耶格的“动态语言反击”的谈话,并在它他那种批评标记和清除的GC(通过链接约5%-10%,有“猪企图对飞”幻灯片)这有什么错他们?

Answer 1:

下面是引用的情况下:

代垃圾收集器是最好的答案我已经得到了,因为它减少了暂停,并坦率地说,今天所有的[新]动态语言的垃圾收集器都是扯淡。 他们是标记和清除,或者他们是引用计数。

从报价,他似乎是在谈论相当原始的GC哪些不是世代。 代选区仍然可以标记和清除,但他们也少了很多,以纪念大部分的时间,这使得他们比快了很多“标记,每次扫天下”。

假设这是他的意思,我同意 - 但他可以解释得更清楚了。 请记住,这是一个谈话,而不是一个博士论文,但 - 想出“关于蹄”表达自己的最清楚的方式是有点棘手:)



Answer 2:

下面是在参考报价提到的各种技术的高级别弹点比较(加“标记并压缩” ......这是对标记和清除的变化。)

引用计数集合的性质是:

  • PRO - 垃圾立即回收(除了循环)
  • PRO - 垃圾收集停顿越来越小,最小的,如果你能推迟更新“自由空间”的数据结构。
  • CON - 引用计数需要对大多数指针写操作调整
  • CON - 自由空间是从来没有压实
  • CON - 因为自由空间,不板结,“自由空间”的数据结构必须维持这增加了分配和回收成本。
  • CON - 循环垃圾不收集,除非应用程序手动打破循环。
  • CON - 在多线程应用程序更新引用计数是额外的昂贵。

对于经典的标记和清除:

  • PRO - 没有指针的写开销
  • PRO - 循环数据收集
  • 可避免存储管理并发瓶颈(除了GC) - PRO
  • CON - 停止这世界的垃圾收集
  • CON - 自由空间是从来没有压实
  • CON - 因为自由空间,不板结,“自由空间”的数据结构必须维持这增加了分配和回收成本。

古典标记 - 扫描有时修改,使得清扫阶段通过“滑动”非垃圾对象压块的自由空间。 这就是所谓的“标记 - 清除紧凑”。 这是相当复杂的,但是:

  • PRO - 没有指针的写开销
  • PRO - 循环数据收集
  • PRO - 存储管理并发瓶颈可以很容易地避免(除了GC)
  • CON - 停止这世界的垃圾收集
  • PRO - 自由空间被压实,所以分配是便宜
  • CON - 紧凑型阶段是相当昂贵

现代收藏家(包括典型的代收集器)基于标记和复制。 这个想法是,收集跟踪对象的“从太空”将它们复制到一个“空间”。 当它完成时,“空间”拥有的可用空间,可用于分配新对象的结束连续块。 旧的“从太空”放在一边的垃圾收集器运行下一次。 有关复制收集的好处是,有一个垃圾对象相关联的垃圾回收成本接近于零。

  • CON - 指针的写开销(以记录时,一个“新的一代”指针被写入到“老一代”的对象)
  • PRO - 循环数据收集
  • PRO - 存储管理并发瓶颈可以很容易地避免(除了GC)
  • CON - 停止这世界的垃圾收集,虽然这可以在一些运行时的开销为代价缓解
  • PRO - 与代收集器,你通常只GC有很多垃圾,因此GC开销堆的一部分是平均少
  • PRO - 小GC暂停(大部分时间)
  • PRO - 自由空间被压实,所以分配是便宜
  • PRO - 压实来更便宜比滑动紧凑
  • CON - 你需要保留一个额外的对象空间的收集器。

甲代收集器是一个其中有多个空间(代),被以不同的速率收集的。 这是基于所创建的大多数对象,然后在短时间内变得不可的假设。 因此,通过垃圾收集含有年轻对象的空间,你以较低的成本回收相对大量的空间。 您还需要收集老一代,但是这可能不太频繁发生。

(A标记 - 清除收集器可代,但放不作为复制收集器一样大。)



Answer 3:

他对比它标志着紧凑 :

代垃圾收集器是最好的答案我已经得到了,因为它减少了暂停,并坦率地说,今天所有的[新]动态语言的垃圾收集器都是扯淡。 他们是标记和清除,或者他们是引用计数。

普通标记和清扫的GC是不那么好,因为他们有堆碎片的问题。 随着共同启用GC-语言的高分配水平,这通常会成为一个问题,比它在如C ++,那里有很多的对象只是生活在堆栈上更快。

尽管如此,马克紧凑真的是马克和与它压实解决扫,这样的术语可能会更好。 非压缩收藏家通常称为“保守”来区分它们。



文章来源: What's wrong with mark-and-sweep GCs?