Language agnostic 什么;“时间精确”;垃圾收集算法确实存在吗?

Language agnostic 什么;“时间精确”;垃圾收集算法确实存在吗?,language-agnostic,garbage-collection,Language Agnostic,Garbage Collection,哪些垃圾收集算法可以在垃圾对象变成垃圾时识别它们 我唯一想到的是引用计数,每次引用计数减为非零值时,都会添加循环搜索 有没有其他有趣的收集算法可以实现这一点?(请注意,我只是出于好奇才提出这个问题;我知道所有这样的收集器可能效率极低)这样的机制称为“堆管理”,而不是垃圾收集 根据定义,垃圾收集与堆管理是解耦的。这是因为在某些环境/应用程序中,跳过“免费”操作并跟踪正在使用的内容更有效。相反,每隔一段时间,就在前一段时间,收集所有未引用的节点,并将它们放回空闲列表中 ==附录== 我因为试图用垃圾

哪些垃圾收集算法可以在垃圾对象变成垃圾时识别它们

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


有没有其他有趣的收集算法可以实现这一点?(请注意,我只是出于好奇才提出这个问题;我知道所有这样的收集器可能效率极低)

这样的机制称为“堆管理”,而不是垃圾收集

根据定义,垃圾收集与堆管理是解耦的。这是因为在某些环境/应用程序中,跳过“免费”操作并跟踪正在使用的内容更有效。相反,每隔一段时间,就在前一段时间,收集所有未引用的节点,并将它们放回空闲列表中

==附录==


我因为试图用垃圾收集纠正堆管理的术语而被否决。虽然那是几十年前的事了,但我在大学里学到的东西和我的用法是一致的。Lisp和Snobol等语言发明了垃圾收集的需求。像C这样的语言不提供如此繁重的运行时环境;取而代之的是依靠程序员来管理未使用的内存和资源位的清理。

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


寿命不超过相关方法调用的对象可以在堆栈上分配,而不是在堆中分配,这样它们可以在编译时从垃圾收集周期中删除,从而降低通用GC的压力。

今天的Hacker News上发布了一篇关于实时GC的帖子。(我没有读过)您可以在每次引用更改后运行标记和扫描GC。虽然这样做效率极低。@svick:你说得对。现在我觉得自己很愚蠢:)@leppie Real-timegc意味着其内存分配由GC控制的代码可以是实时的,例如通过在滑动时间窗口上保证一定百分比的CPU利用率。这与交易的及时性无关。事实上,这个目标(和许多其他目标一样)与它相冲突。没有,有效地确定一个对象是否是垃圾就像np难一样。检测垃圾循环听起来很容易,但实际上很难做到。在最坏的情况下,这项工作相当于在mark&sweep collector中完成完整的mark阶段。对我来说,这听起来像是一个术语性的评论,实际上并不是问题的答案。而且我认为你是不对的。引用计数是垃圾收集的一种形式。@wallyk:你提到了一篇维基百科文章(为什么不链接它?)。我在维基百科上查阅了“堆管理”,它重定向到“内存管理”,主要处理操作系统级的细节和分配器技术,这与我的问题并不完全相关。另外,正如斯维克已经评论的那样,你的帖子并没有真正回答我的问题。你的回答基本上解释了为什么现实生活中的收藏家在我的作品中提出的问题上不起作用,这一点我已经意识到了,就像我在问题中说的那样。不过,请随意编辑您的答案,以实际回答问题,我将对其进行投票。@BillAskaga:我确实链接了它:它显示“Wikipedia文章”,但变灰后很难看到。我会考虑一下回答这个问题,但是这个术语让我大吃一惊。@wallyk你链接的文章说引用计数是垃圾收集的一种形式。而且它只使用了一次术语“堆管理”,没有实际解释它。你认为这篇文章的哪一部分表达了你的意思?也许我误解了你的意思。