22

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

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

4

1 回答 1

26

是的。GHC 堆没有保存在一段连续的内存中;相反,它被组织成块

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

由于这意味着我们可能需要一段时间才能回收大块内的死空间,这确实意味着大对象可能会遭受碎片化,如错误7831所示。但是,这通常不会发生,直到单个分配达到兆块大小的一半,即 1M。

于 2013-04-24T09:18:20.317 回答