直觉上讲,考虑到延迟评估的thunk可以包含循环并与垃圾回收同时进行更新,对于可变数据,这看起来与GC并无多大区别-除非指针仅需要遍历一次,在评估期间重写或重写压缩暂停。
Haskell wiki book中的声明是否正确地确定了在堆上拥有不变的(懒惰评估的)数据的好处?
该算法是否可以防止在运行时共享通常减少的值(例如小整数或字符串),从而导致保留更多数据并在周围复制?
答案 0 :(得分:2)
Wikibook上的该页面包含一个指向GHC垃圾收集器及其背后逻辑的准确描述的链接(http://simonmar.github.io/bib/papers/parallel-gc.pdf);由实际写的人之一。
GHC使用分代垃圾收集器。它不会遍历每个垃圾回收阶段中的每个对象,而是将堆分为3个“世代”,编号分别为0、1和2。创建对象时,它们最初位于世代0中。每次运行垃圾收集器时都会遍历该对象。如果一个对象在进行了几轮垃圾回收后仍然存在,那么它就被认为是一个寿命很长的对象,并被提升到下一代。检查频率较低。当对象A对对象B的引用是不变的时:这意味着B的存在时间至少应与A一样长,因此垃圾收集器还会提升B。
由于懒惰的评估:Wikibook中声称“不变数据永远不会指向更年轻的值”的说法实际上是错误的;但是不变性确实可以帮助垃圾收集器估计堆对象的生存期。