Haskell GHC垃圾收集器是否对大型对象进行了任何特殊优化?

Haskell GHC垃圾收集器是否对大型对象进行了任何特殊优化?,haskell,ghc,Haskell,Ghc,GHC垃圾收集器是否专门处理“大”对象?或者它对待它们和对待其他物体完全一样 一些GC引擎将大型对象放在一个单独的区域,该区域的扫描频率较低,并且可能具有不同的收集算法(例如,压缩而不是复制,或者甚至可能使用自由列表而不是尝试碎片整理)。GHC做过类似的事情吗?是的。GHC堆不保存在一个连续的内存段中;事实恰恰相反 当分配对象的大小高于特定阈值(block_size*8/10,其中block_size为4k,约为3.2k)时,保存该对象的块被标记为大(BF_large)。现在,当垃圾收集发生时,

GHC垃圾收集器是否专门处理“大”对象?或者它对待它们和对待其他物体完全一样


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

是的。GHC堆不保存在一个连续的内存段中;事实恰恰相反

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


因为这意味着我们可能需要一段时间来回收一个大区块内的死空间,这确实意味着大型对象可能会受到碎片的影响,如bug中所示。然而,在单个分配达到兆块大小的一半(1M)之前,通常不会发生这种情况。

在本例中,块大小不应该是5k,阈值不应该是4k吗?啊,是的,你说得对,我翻转了乘法。块大小为4k;阈值约为3.2k;我已经修好了。