2013-04-24 24 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