为什么参考计数GC被污名化?

时间:2012-01-20 10:40:35

标签: memory garbage-collection reference reference-counting mark-and-sweep

我曾经读过一些关于理想主义但“懒惰”程序员尝试实现编程语言的共同思想。它如下: -

'我知道,我会做一个易于实现和快速编写的引用计数GCer,然后在我有时间时将其重新实现为真正的GCer。'

当然,这种重新实现永远不会发生。

但是,我质疑为什么需要这样的重新实现。为什么增量和并发类型的标记和扫描收集器被认为优于Perl 5和Python等语言所谓的过时方法? (是的,我知道Python使用标记和扫描收集器来增强这种方法。)

循环引用是此类讨论中的第一个主题。是的,它可能是一种痛苦(参见Perl中的递归代码转换,并修复它涉及多个赋值和引用弱化。)是的,当编码器必须不断监视该类型的引用时,它并不那么优雅。

虽然替代品更好吗?我们可以讨论永恒的细粒度实现细节,但事实是,大多数标记和扫描GC实现都存在以下问题: -

  • 非确定性的资源破坏,导致代码难以推理且过于冗长(参见.NET中的IDispose或许多其他语言中的try / finally替换。)
  • 不同类别垃圾的额外复杂性,适用于短期,长寿,以及介于两者之间的所有内容,具有合理性能所需的复杂性。
  • 需要另一个线程,或者需要定期暂停执行程序以执行收集。

标记和扫描的缺点是否合理地解决了引用计数问题,这些问题可以通过弱引用来缓解?

0 个答案:

没有答案