Haskell程序由于垃圾回收可能会发生多长时间的暂停?

19

关于我另一个问题的相关内容(每个操作都保证最坏情况下的Haskell集合?), 我很好奇: 垃圾回收可能会导致多长时间的暂停?

Haskell是否使用某种增量垃圾回收方式,以便程序仅在短时间内停止,或者在极端情况下可以停止数秒钟?

我在这个主题上找到了两篇SPJ的论文:https://research.microsoft.com/en-us/um/people/simonpj/papers/non-stop/index.htm。但我没有找到一个参考,说明这些想法实际上是否被GHC(或其他Haskell实现)采纳。


4
请注意,理论上程序运行过程中有很多导致不可预测的无限延迟的原因,包括虚拟内存分页和操作系统执行的上下文切换。即使是那些不使用自动垃圾回收的语言也会受到这些影响。理论上,它们可以在任何程序的任何两个操作之间插入延迟, 没有保证 最大延迟长度。实际上,在“正常”编程中,这些很少是你需要应对的问题。垃圾回收的延迟也一样。 - Ben
1个回答

24
GHC旨在提高计算吞吐量,而非降低延迟。因此,GHC使用一个分代的、多线程的垃圾收集器,具有本地线程堆。对于本地线程对象的垃圾收集不会停止其他线程。全局堆的偶尔发生的主要GC将暂停所有线程。
通常情况下,这些暂停只有几毫秒,但不能保证延迟。
您可以通过几个运行时标志(例如gc -I间隔)来控制GC的频率。

3
我相当确定线程本地堆的东西实际上并没有被纳入主流。Simon Marlow说这使得GC变得更加复杂,而且并没有显著改善GC的性能。因此,修订后的答案是:所有的GC都会导致暂停(通常很短),而且主要的GC是并行执行的。实际的暂停时间非常取决于堆的大小。+RTS -s实际上会打印出暂停时间,所以很容易找出来。 - nominolo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接