haskell - GHC垃圾收集器对于大对象有什么特殊的优化吗?

标签 haskell ghc

GHC 垃圾收集器是否专门处理“大”对象?或者它对待它们与任何其他对象完全相同吗?

一些 GC 引擎将大型对象放在单独的区域中,该区域的扫描频率较低,并且可能具有不同的收集算法(例如,压缩而不是复制,或者甚至可能使用空闲列表而不是尝试碎片整理)。 GHC 会做这样的事情吗?

最佳答案

是的。 GHC 堆并不保存在一段连续的内存中;相反,它是 organized into blocks .

当分配的对象的大小高于特定阈值(block_size*8/10,其中 block_size 为 4k,因此大约为 3.2k)时,保存该对象的 block 将被标记为大 (BF_LARGE)。现在,当垃圾收集发生时,不是将大对象从该 block 复制到新的 block ,而是将该 block 本身添加到新一代的 block 集中;这涉及到摆弄链接列表(准确地说,是一个大对象列表)。

由于这意味着我们可能需要一段时间才能回收大块内的无效空间,因此这确实意味着大对象可能会遭受碎片的困扰,如 bug 7831 中所示。 。但是,这种情况通常不会发生,直到单个分配达到巨型 block 大小的一半(1M)。

关于haskell - GHC垃圾收集器对于大对象有什么特殊的优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16186488/

相关文章:

haskell - 如何在 haskell 中为 hie 开启所有迂腐模式?

python - 在 Numpy 中映射失败

haskell - GHC 内部结构 : is there C implementation of the type system?

haskell - 我如何帮助 GHC 中的 SpecConstr?

haskell - GHC 中 Haskell 线程和操作系统线程之间的关系

haskell - 试图理解 Monad。 >> 运算符

haskell - 当 thunk 被垃圾收集时,Haskell 会丢弃 Spark 吗?

haskell - ghc 可以将某些指定的警告视为错误而将其他警告视为警告吗?

haskell - 在 Haskell 中检测冗余约束?

haskell - 递归函数依赖不起作用