存在哪些“时间精确”的垃圾回收算法?

What "time precise" garbage collection algorithms do exist?

提问人:Askaga 提问时间:6/6/2013 更新时间:2/13/2014 访问量:156

问:

哪些垃圾回收算法可以在垃圾对象成为垃圾后立即识别它们

我唯一想到的是每次引用计数递减到非零值时,都会添加循环搜索的引用计数。

有没有其他有趣的收集算法可以实现这一点?(请注意,我只是出于好奇而问;我知道所有这些收集器都可能效率低得令人难以置信)

与语言无关的 垃圾回收

评论

0赞 leppie 6/6/2013
今天在Hacker News上有一篇关于实时GC的帖子。(我没有读过)
0赞 svick 6/6/2013
您可以在每次引用更改后运行标记和扫描 GC。尽管这将是极其低效的。
0赞 Askaga 6/6/2013
@svick:你说得对。现在我觉得很愚蠢:)
0赞 6/7/2013
@leppie 实时 GC 意味着其内存分配由 GC 控制的代码可以是实时的,例如,通过保证在滑动时间窗口内一定百分比的 CPU 利用率。它与解除分配的及时性无关。事实上,这个目标(像许多其他目标一样)与它相冲突。
1赞 Stand with Gaza 6/3/2016
没有,有效地确定一个对象是否是垃圾就像 np-hard。检测垃圾循环听起来很容易,但实际上很难做到。在最坏的情况下,这项工作相当于在标记和扫描收集器中执行一个完整的标记阶段。

答:

-4赞 wallyk 6/6/2013 #1

这种机制将被称为“堆管理”,而不是垃圾回收。

根据定义,垃圾回收与堆管理分离。这是因为在某些环境/应用程序中,跳过执行“免费”操作并跟踪正在使用的内容会更有效。取而代之的是,每隔一段时间,就收集所有未引用的节点,并将它们放回自由列表中。

== 附录 ==

我因试图通过垃圾回收纠正堆管理的术语而被否决。维基百科的文章同意我的用法,以及我在大学里学到的东西,尽管那是几十年前的事了。Lisp 和 Snobol 等语言发明了垃圾回收的需求。像 C 这样的语言不提供如此繁重的运行时环境;相反,依靠程序员来管理未使用的内存和资源位的清理。

评论

1赞 svick 6/6/2013
对我来说,这听起来像是一个术语评论,实际上不是问题的答案。
0赞 svick 6/6/2013
另外,我认为你是对的。引用计数垃圾回收的一种形式。
0赞 Askaga 6/6/2013
@wallyk:你提到了一篇维基百科文章(为什么不链接它?我在维基百科上查找了“堆管理”,它重定向到“内存管理”,主要处理操作系统级别的详细信息和分配器技术,这与我的问题并不完全相关。另外,正如 svick 已经评论的那样,您的帖子并没有真正回答我的问题。你的回答基本上解释了为什么现实生活中的收藏家不在我的行动中提出的问题中工作,我已经意识到了这一事实,就像我在问题中明确指出的那样。但是,请随意编辑您的答案以实际回答问题,我会投赞成票。
0赞 wallyk 6/6/2013
@BillAskaga:我确实链接了它:它说“维基百科文章”,但灰色使它很难看到。我会考虑一下回答这个问题,但术语让我感到困惑。
1赞 svick 6/6/2013
@wallyk 您链接到的文章说引用计数是垃圾回收的一种形式。它只使用了一次术语“堆管理”,而没有实际解释它。你认为文章的哪一部分说了你在说什么?虽然也许我误解了你想说的话。
0赞 Alexander Kogtenkov 2/13/2014 #2

虽然不是垃圾回收算法,但转义分析允许对对象的生命周期进行推理。因此,如果效率是一个问题,并且不应该在所有情况下收集对象,而是在“明显”的情况下收集对象,那么它可能会很方便。其基本思想是对程序执行静态分析(在编译时或加载时,如果为 VM 编译),并确定新创建的对象是否可以转义创建它的例程(因此分析的名称)。如果对象没有传递到其他任何地方,没有存储在全局内存中,没有从给定的例程返回,等等,则可以在从该例程返回之前释放它,甚至更早,在其最后一次使用的地方。

生存时间不超过关联方法调用时间的对象可以分配在堆栈上而不是堆中,因此可以在编译时将它们从垃圾回收周期中删除,从而降低常规 GC 的压力。