【问题标题】:What "time precise" garbage collection algorithms do exist?确实存在哪些“时间精确”的垃圾收集算法?
【发布时间】:2013-06-01 14:22:05
【问题描述】:

哪些垃圾收集算法可以在垃圾对象变成垃圾后立即识别

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

还有其他有趣的收集算法可以实现吗? (请注意,我只是出于好奇而询问;我知道所有此类收集器的效率可能都非常低)

【问题讨论】:

  • 今天在 Hacker News 上有一篇关于实时 GC 的帖子。 (我没看过)
  • 您可以在每次引用更改后运行标记和清除 GC。虽然那会非常低效。
  • @svick:你是对的。现在我觉得自己很愚蠢:)
  • @leppie 实时 GC 意味着内存分配由 GC 控制的代码可以是实时的,例如通过在滑动时间窗口内保证一定百分比的 CPU 利用率。它与释放的及时性无关。事实上,这个目标(像许多其他目标一样)与它相冲突..
  • 没有,有效地确定一个对象是否是垃圾就像 np-hard。检测垃圾循环听起来很容易,但实际上很难做到。在最坏的情况下,这项工作相当于在标记和清除收集器中进行完整标记阶段。

标签: language-agnostic garbage-collection


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    == 附录 ==

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

    【讨论】:

    • 这对我来说听起来像是一个术语评论,实际上并不是问题的答案。
    • 我也不认为你是对的。引用计数垃圾回收的一种形式。
    • @wallyk:您提到了一篇维基百科文章(为什么不链接它?)。我在维基百科上查找了“堆管理”,它重定向到“内存管理”,主要处理操作系统级别的细节和分配器技术,这与我的问题并不完全相关。此外,正如 svick 已经评论的那样,您的帖子并没有真正回答我的问题。您的回答基本上解释了为什么现实生活中的收藏家在我的操作中提出的问题上不起作用,我已经知道这一事实,就像我在我的问题中明确指出的那样。但是,请随时编辑您的答案以实际回答问题,我会投票赞成。
    • @BillAskaga:我确实链接了它:它是上面写着“维基百科文章”的地方,但是变灰让人很难看到。我会考虑回答这个问题,但术语让我很困惑。
    • @wallyk 你链接到的文章说引用计数是垃圾收集的一种形式。它只使用了一次“堆管理”这个术语,没有实际解释它。你认为文章的哪一部分说明了你在说什么?虽然也许我误解了你想说的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多