Gambit-C的GC机制是什么?

5

什么是Gambit-C的GC机制?我对此很感兴趣,因为我要制作交互式应用程序。我想知道它是否可以避免突发GC操作。


最终,这只是关于用户体验的问题——只要没有用户能够明显地感受到停顿... - user166390
http://dynamo.iro.umontreal.ca/~gambit/wiki/index.php/Notes_on_Memory_Management 似乎表明正在使用引用计数,但这些是2007年的笔记(这意味着在这些情况下可以进行立即释放)。 - user166390
@pst 这是一个软实时应用程序的结果吗?如果它使用立即引用计数,那么它如何正确处理循环引用呢? - eonil
我不使用Gambit-C,那只是我能找到的所有信息,而且我甚至不确定它是否直接适用 -- 最好的选择是在ML上询问或查看源代码 :( 现代引用计数系统(如CPython和PHP)使用额外的循环检测/中断阶段来处理循环引用。 引用计数的一个好处是可以立即执行解除分配,因此摊销(即使长期效率较低)。对于大多数“交互式”应用程序,现代的标记和扫描/混合GC没有问题(例如.NET / JVM),甚至还有一个软实时JVM。 - user166390
2个回答

2
根据这些帖子:

Gambit至少在2008年9月之前采用传统的停止-世界垃圾回收。线程中的人们建议使用预分配的对象池来避免垃圾回收操作本身。我找不到当前实现的相关信息。

*很难同意这段对话。因为我无法池化未由自己编写的对象,最终会有小型/非池化临时对象累积导致完全垃圾回收。但@Gregory提到的方法可能有助于避免这个问题。然而,我希望Gambit能添加增量GC :)


1

根据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之类的值,那么假定垃圾回收将频繁运行,并且每次运行都不会做太多工作。这可能会导致总体上更昂贵,但避免了突发性的开销。然后,您可以相当容易地预算这种开销,以使服务快速运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接