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

Pet*_*lák 19 garbage-collection haskell delay

关于我的其他问题Haskell集合是否保证每个操作的最坏情况界限?,我很好奇:垃圾收集会导致多长时间停顿?

Haskell是否使用某种增量垃圾收集,以便程序一次只能停止一小段时间,或者在极端情况下可以停止几秒钟?

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

Don*_*art 24

GHC专为计算吞吐量而非延迟而设计.因此,GHC使用具有线程局部堆世代多线程垃圾收集器.线程局部对象的垃圾收集不会阻止其他线程.全局堆的偶然主要GC将暂停所有线程.

通常,暂停是在很短的毫秒数内,但是不能保证延迟.

您可以通过几个运行时标志(例如gc -I间隔)控制GC的频率.

  • 我很确定线程本地堆积的东西实际上并不在主线上.西蒙马洛说,它使GC更加复杂,同时没有提高GC的性能.因此,修改后的答案是:所有GC都会导致暂停(通常很短),并且主要GC会并行执行.实际的暂停时间在很大程度上取决于堆大小.`+ RTS -s`实际上打印了暂停时间,因此很容易找到. (3认同)