垃圾收集需要多少额外内存?

14 garbage-collection

我曾经听说过一种语言实现并正确运行垃圾收集,平均需要3倍的内存.我不确定这是假设应用程序是小型,大型还是其中之一.

所以我想知道是否有任何研究或实际数量的垃圾收集开销.另外我想说GC是一个非常好的功能.

Kev*_*udé 8

您需要的内存空间量取决于程序中的分配率.如果您的分配率很高,那么在GC运行时您需要更多的增长空间.

另一个因素是物体寿命.如果您的对象通常具有非常短的生命周期,那么您可以使用世代收集器以较少的净空进行管理.

有很多研究论文可能会让您感兴趣.我稍后会编辑以引用一些.

编辑(2011年1月):

我正在想一份我现在似乎无法找到的特定论文.下面的内容很有趣,并包含一些相关的性能数据.根据经验,您通常可以使用大约两倍于程序驻留的可用内存.有些程序需要更多,但即使在受限制的环境中,其他程序也会表现得非常好.有很多变量会影响这一点,但分配率是最重要的.

  1. Immix:标记区域垃圾收集器,具有空间效率,快速收集和增变性能

  2. 神话和现实:垃圾收集的性能影响

    编辑(2013年2月):此编辑为引用的论文添加了平衡的视角,并解决了Tim Cooper提出的异议.

  3. 如Natan Yellin所述,量化垃圾收集与显式内存管理的性能实际上是我在2011年1月首次尝试记住的参考.但是,我认为Natan提供的解释是正确的.该研究并未将GC与传统的手动内存管理进行比较.相反,它将GC与完美显式版本的oracle进行了比较.换句话说,它让我们不知道传统的手动内存管理与神奇的oracle相比有多好.也很难找到它,因为源程序要么考虑到GC,要么考虑到手动内存管理.所以任何基准都保留了固有的偏见.

在Tim Cooper的反对意见之后,我想澄清一下我对记忆空间主题的立场.我这样做主要是为了后人,因为我相信Stack Overflow的答案应该成为许多人的长期资源.

典型的GC系统中有许多内存区域,但有三种抽象类型:

  • 分配的空间(包含实时,死亡和未跟踪的对象)
  • 保留空间(从中分配新对象)
  • 工作区域(长期和短期GC数据结构)

什么是净空?净空是保持所需性能水平所需的最小预留空间量. 我相信这就是OP所要求的. 您还可以将余量视为实际程序驻留(最大实时内存)之外的内存,以获得良好性能.

是的 - 增加净空可以延迟垃圾收集并提高吞吐量.这对离线非关键操作很重要.

实际上,大多数问题域都需要实时解决方案.有两种实时,它们是非常不同的:

  • 硬实时关注最坏情况延迟(对于关键任务系统) - 来自分配器的延迟响应是一个错误.
  • 软实时关注平均延迟或中位延迟 - 分配器的延迟响应是可以的,但不应经常发生.

大多数最先进的垃圾收集器都以软实时为目标,这对桌面应用程序以及按需提供服务的服务器都有好处.如果一个人将实时作为一项要求消除,那么人们也可以使用一个世界末日的垃圾收集器,其余空间开始失去意义.(注意:主要是短期对象和高分配率的应用程序可能是一个例外,因为存活率很低.)

现在假设我们正在编写一个具有软实时要求的应用程序.为简单起见,我们假设GC在专用处理器上同时运行.假设程序具有以下人为属性:

  • 平均居住时间:1000 KB
  • 预留净空:100 KB
  • GC循环持续时间:1000毫秒

和:

  • 分配率A:100 KB/s
  • 分配率B:200 KB/s

现在我们可能会看到以下分配率A的事件时间表:

  • T + 0000 ms:GC循环开始,100 KB可用于分配,1000 KB已分配
  • T + 1000毫秒:
    • 保留空间0 KB,分配1100 KB
    • GC循环结束,100 KB释放
    • 100 KB免费预留,1000 KB分配
  • T + 2000 ms:与上述相同

分配率B的事件的时间表是不同的:

  • T + 0000 ms:GC循环开始,100 KB可用于分配,1000 KB已分配
  • T + 0500毫秒:
    • 保留空间0 KB,分配1100 KB
      • 延迟到GC循环结束(坏,但有时是强制性的),或
      • 将保留大小增加到200 KB,免费100 KB(假设在这里)
  • T + 1000毫秒:
    • 预留空间0 KB,分配1200 KB
    • GC循环结束,释放200 KB
    • 200 KB免费预留,1000 KB分配
  • T + 2000毫秒:
    • 预留空间0 KB,分配1200 KB
    • GC循环结束,释放200 KB
    • 200 KB免费预留,1000 KB分配

请注意分配率如何直接影响所需的净空大小?使用分配率B,我们需要两倍的净空以防止暂停并保持相同的性能水平.

这是一个非常简单的例子,旨在说明一个想法. 还有很多其他因素,但它确实显示了预期的内容.请记住我提到的另一个主要因素:平均物体寿命.寿命短导致低存活率,其与分配率一起影响维持给定性能水平所需的存储量.

简而言之,在不了解和理解应用程序的特征的情况下,不能对所需的空间进行一般性声明.

  • @TimCooper我不确定为什么我们会误传,但你对我的话和我的意图的沟通的解释是不一致的.我已经扩展了我的答案以澄清.最好的问候,凯文. (2认同)