2013-04-24 28 views
22

GHC垃圾收集器是否特别处理“大”对象?还是它对待他们完全一样的任何其他对象?一些GC引擎把大对象放在一个单独的区域,扫描得不太规律,并且可能有不同的采集算法(例如,压缩而不是复制,或者甚至使用自由列表而不是尝试整理碎片)。 GHC做这样的事情吗?GHC垃圾收集器对大型对象有特殊的优化吗?

回答

26

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

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

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

+4

不应该block_size为5k,在示例中阈值4k? – Sal 2013-04-26 23:35:25

+1

啊,是的,你说得对,我翻转了乘法。 block_size是4k;阈值是~3.2k;我修复了它。 – 2013-05-02 22:22:18