GHC 垃圾收集器是否专门处理“大”对象?或者它对待它们与任何其他对象完全相同吗?
一些 GC 引擎将大型对象放在单独的区域中,该区域的扫描频率较低,并且可能具有不同的收集算法(例如,压缩而不是复制,或者甚至可能使用空闲列表而不是尝试碎片整理)。 GHC 会做这样的事情吗?
最佳答案
是的。 GHC 堆并不保存在一段连续的内存中;相反,它是 organized into blocks .
当分配的对象的大小高于特定阈值(block_size*8/10,其中 block_size 为 4k,因此大约为 3.2k)时,保存该对象的 block 将被标记为大 (BF_LARGE)。现在,当垃圾收集发生时,不是将大对象从该 block 复制到新的 block ,而是将该 block 本身添加到新一代的 block 集中;这涉及到摆弄链接列表(准确地说,是一个大对象列表)。
由于这意味着我们可能需要一段时间才能回收大块内的无效空间,因此这确实意味着大对象可能会遭受碎片的困扰,如 bug 7831 中所示。 。但是,这种情况通常不会发生,直到单个分配达到巨型 block 大小的一半(1M)。
关于haskell - GHC垃圾收集器对于大对象有什么特殊的优化吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16186488/