Gambit-C 的 GC 机制是什么?我对制作交互式应用程序感到好奇。我想知道它是否可以避免突发 GC 操作。
2 回答
根据这些线程:
- https://mercure.iro.umontreal.ca/pipermail/gambit-list/2005-December/000521.html
- https://mercure.iro.umontreal.ca/pipermail/gambit-list/2008-September/002645.html
Gambit 至少在 2008 年 9 月之前都有传统的 stop-the-world GC。线程中的人们建议使用预分配对象池来避免 GC 操作本身。我无法找到有关当前实施的信息。
*很难同意谈话。因为我不能池化不是我自己写的对象,最终完全 GC 会在某个时候通过累积的小/非池化临时对象发生。但是@Gregory 提到的方法可能有助于避免这个问题。但是,我希望将增量 GC 添加到 Gambit :)
根据http://dynamo.iro.umontreal.ca/~gambit/wiki/index.php/Debugging#Garbage_collection_threshold gambit 有一些控制:
垃圾回收阈值
注意运行时选项 h(以千字节为单位的最大堆大小)和 l(livepercent)。有关详细信息,请参阅参考手册。将 livepercent 设置为 5 意味着垃圾收集将在分配给应该被垃圾收集的对象的内存是分配给不应该被垃圾收集的对象的内存的 19 倍时进行。存在 livepercent 选项的原因是为了提供一种方法来控制垃圾收集器在内存消耗方面的节省/慷慨程度,以及它在 CPU 负载中的重量/轻量。
您始终可以通过 (##gc) 强制进行垃圾收集。
如果您在少量操作后强制进行垃圾收集,或者连续安排它,或者将 livepercent 设置为 90 左右,那么 gc 可能会频繁运行,并且每次运行都不会做很多事情。总体而言,这可能会更昂贵,但要避免费用激增。然后,您可以相当容易地预算这笔费用,以使服务快速。