gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 22:13:58 26 4
gpt4 key购买 nike

我曾经听说过,一种语言要正确实现和运行垃圾收集,平均需要多出 3 倍的内存。我不确定这是假设应用程序是小、大还是两者之一。

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

最佳答案

您需要的内存空间量取决于程序中的分配率。如果您的分配率很高,则在 GC 工作时您需要更多的增长空间。

另一个因素是对象生命周期。如果您的对象的生命周期通常很短,那么您可以使用分代收集器以稍少的空间进行管理。

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

编辑(2011 年 1 月):

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

  • Immix: a mark-region garbage collector with space efficiency, fast collection, and mutator performance
  • Myths and realities: the performance impact of garbage collection

    编辑(2013 年 2 月):此编辑对引用的论文增加了平衡的观点,并解决了 Tim Cooper 提出的反对意见。
  • Quantifying the Performance of Garbage Collection vs. Explicit Memory Management ,正如 Natan Yellin 所指出的,实际上是我在 2011 年 1 月第一次试图记住的引用。但是,我认为 Natan 提供的解释是不正确的。该研究并未将 GC 与传统的手动内存管理进行比较。相反,它将 GC 与执行完美显式发布的 oracle 进行比较。换句话说,它让我们不知道传统的手动内存管理与魔法预言机相比有多好。也很难发现这一点,因为源程序要么考虑了 GC,要么考虑了手动内存管理。因此,任何基准都会保留固有的偏见。

  • 根据 Tim Cooper 的反对意见,我想澄清我对内存余量主题的立场。我这样做主要是为了后代,因为我相信 Stack Overflow 的答案应该作为许多人的长期资源。

    一个典型的 GC 系统中有很多内存区域,但是三种抽象类型是:
  • 分配的空间(包含事件的、死的和未追踪的对象)
  • 保留空间(从中分配新对象)
  • 工作区(长期和短期GC数据结构)

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

    是的——增加净空会延迟垃圾收集并增加吞吐量。这对于离线非关键操作很重要。

    实际上,大多数问题域都需要实时解决方案。有两种实时,它们是非常不同的:
  • 硬实时关注最坏情况的延迟(对于关键任务系统)——分配器的延迟响应是一个错误。
  • 软实时关注平均延迟或中值延迟——分配器的延迟响应是可以的,但不应该经常发生。

  • 大多数最先进的垃圾收集器旨在实现软实时,这对桌面应用程序以及按需提供服务的服务器都有好处。如果将实时性作为一项要求排除在外,那么还不如使用 stop-the-world 垃圾收集器,在这种情况下,净空开始失去意义。 (注意:主要是短期对象和高分配率的应用程序可能是一个异常(exception),因为存活率很低。)

    现在假设我们正在编写一个具有软实时要求的应用程序。为简单起见,让我们假设 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,我们需要两倍的空间来防止暂停并保持相同的性能水平。

    这是一个非常简化的示例,旨在仅说明一个想法。 还有很多其他因素,但它确实表明了意图。请记住我提到的另一个主要因素:平均对象生命周期。短生命周期导致低存活率,它与分配率一起影响维持给定性能水平所需的内存量。

    简而言之,如果不了解和理解应用程序的特性,就不能对所需的净空做出一般性声明。

    关于garbage-collection - 垃圾收集需要多少额外内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4854599/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com