GHC垃圾收集器是否特意处理“大”对象?或者它对待它们与任何其他对象完全相同?
某些GC引擎将大型对象放在一个单独的区域中,该区域的扫描次数较少,并且可能具有不同的收集算法(例如,压缩而不是复制,或者甚至可能使用空闲列表而不是尝试进行碎片整理)。 GHC会做这样的事吗?
答案 0 :(得分:26)
是。 GHC堆不会保存在一个连续的内存中;相反,它是organized into blocks。
当分配的对象的大小高于特定阈值(block_size * 8/10,其中block_size为4k,大约为3.2k)时,持有该对象的块被标记为大(BF_LARGE)。现在,当发生垃圾收集时,不是将大块对象从这个块复制到新块,而是将块本身添加到新一代块的块中;这涉及摆弄链表(确切地说是一个大对象列表)。
因为这意味着我们可能需要一段时间来回收大块内的死区,这确实意味着大型对象可能会受到碎片的影响,如bug 7831中所示。但是,这通常不会发生,直到单个分配达到兆块大小的一半,即1M。