主要观点:
- Guile 已与基于 Nofl 的收集器配合工作,使用保守的堆扫描方式,但存在一些与堆大小启发式相关的问题。
- Whippet 有固定、可增长和自适应三种堆大小策略,目前 Guile 使用可增长策略,存在碎片导致的活锁问题。
- 根本问题是碎片,解决方法包括消除碎片(使用半空间收集器)、提高堆乘数、改变堆组织等,但都有局限性。
- 若无法处理碎片,仅依靠堆乘数来调整堆大小是不可行的,需考虑其他方式,如预留空块等。
- 正在为 Nofl 寻找解决方案,包括预留空块和类似 Immix 的溢出块机制。
关键信息:
- Guile 与[heap-conservative-mmc / heap-conservative-parallel-mmc]收集器配合,可通过 GUILE_GC_OPTIONS 环境变量设置堆大小乘数等。
- 可增长堆策略在碎片环境下易导致活锁,如 10MB 堆、2 倍乘数和 16 字节对象与洞的序列。
- 消除碎片可解决问题,但可能存在块级碎片;提高堆乘数可增加平均洞大小,但 512 倍乘数过大。
- 改变堆组织可能仍存在问题,如按块大小分区可能导致类似问题。
- 正在为 Nofl 寻找启发式解决方案,包括预留空块和溢出块机制。
重要细节:
- 在 Guile 引导期间遇到 7072 字节向量分配的活锁问题。
- Nofl 块为 64kB,最大“小对象”为 8kB。
- Immix 为溢出分配预留块以减少碎片。
- 目前作者对精确跟踪堆边缘仍在期待中,以解决碎片问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。