GHC垃圾收集器是否对大型对象有任何特殊优化?

Mat*_*hid 22 haskell ghc

GHC垃圾收集器是否特别处理"大"对象?或者它对待它们与任何其他对象完全相同?

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

Edw*_*ang 26

是.GHC堆不会保存在一个连续的内存中; 相反,它被组织成块.

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

因为这意味着我们可能需要一段时间来回收大块内的死空间,这确实意味着大型对象可能会受到碎片的影响,如bug 7831所示.但是,这通常不会发生,直到单个分配达到兆块大小的一半,即1M.

  • block_size不应该是5k,而示例中的阈值是4k吗? (4认同)