首页 > 解决方案 > 在惰性评估语言中,不变性会提高 GC 性能吗?

问题描述

直观地说,鉴于惰性求值的 thunk 可以包含循环并与垃圾回收同时更新,这看起来与 GC 用于可变数据并没有太大不同——除了指针可能只需要遍历一次,在压缩暂停期间进行评估或重写。

Haskell wiki 书中的声明是否正确识别了在堆上拥有不可变(延迟评估)数据的好处?

该算法是否会阻止在运行时共享通常减少的值(如小整数或字符串),从而导致保留和复制更多数据?

标签: haskellghc

解决方案


wikibook 中的该页面包含指向 GHC 垃圾收集器及其背后逻辑的准确描述的链接(http://simonmar.github.io/bib/papers/parallel-gc.pdf);由实际编写它的人之一。

GHC 使用分代垃圾收集器。它不会在每个垃圾回收阶段遍历每个对象,而是将堆分成 3 个“代”,编号为 0、1 和 2。创建对象时,它们最初放置在第 0 代;每次运行垃圾收集器时都会遍历它。如果一个对象在几轮垃圾收集中幸存下来,它就被认为是一个长寿命的对象,并被提升到下一代;检查频率较低。当对象 A 具有对对象 B 的不可变引用时:这意味着 B 需要至少与 A 一样存在,因此垃圾收集器也会提升 B。

因为懒惰的评估:wikibook 中关于“不可变数据永远不会指向更年轻的值”的说法实际上是错误的;但是不变性确实通过帮助垃圾收集器估计堆对象的生命周期来帮助它。


推荐阅读