我曾经听说过一种语言实现并正确运行垃圾收集,平均需要3倍的内存.我不确定这是假设应用程序是小型,大型还是其中之一.
所以我想知道是否有任何研究或实际数量的垃圾收集开销.另外我想说GC是一个非常好的功能.
您需要的内存空间量取决于程序中的分配率.如果您的分配率很高,那么在GC运行时您需要更多的增长空间.
另一个因素是物体寿命.如果您的对象通常具有非常短的生命周期,那么您可以使用世代收集器以较少的净空进行管理.
有很多研究论文可能会让您感兴趣.我稍后会编辑以引用一些.
编辑(2011年1月):
我正在想一份我现在似乎无法找到的特定论文.下面的内容很有趣,并包含一些相关的性能数据.根据经验,您通常可以使用大约两倍于程序驻留的可用内存.有些程序需要更多,但即使在受限制的环境中,其他程序也会表现得非常好.有很多变量会影响这一点,但分配率是最重要的.
编辑(2013年2月):此编辑为引用的论文添加了平衡的视角,并解决了Tim Cooper提出的异议.
如Natan Yellin所述,量化垃圾收集与显式内存管理的性能实际上是我在2011年1月首次尝试记住的参考.但是,我认为Natan提供的解释是正确的.该研究并未将GC与传统的手动内存管理进行比较.相反,它将GC与完美显式版本的oracle进行了比较.换句话说,它让我们不知道传统的手动内存管理与神奇的oracle相比有多好.也很难找到它,因为源程序要么考虑到GC,要么考虑到手动内存管理.所以任何基准都保留了固有的偏见.
在Tim Cooper的反对意见之后,我想澄清一下我对记忆空间主题的立场.我这样做主要是为了后人,因为我相信Stack Overflow的答案应该成为许多人的长期资源.
典型的GC系统中有许多内存区域,但有三种抽象类型:
什么是净空?净空是保持所需性能水平所需的最小预留空间量. 我相信这就是OP所要求的. 您还可以将余量视为实际程序驻留(最大实时内存)之外的内存,以获得良好性能.
是的 - 增加净空可以延迟垃圾收集并提高吞吐量.这对离线非关键操作很重要.
实际上,大多数问题域都需要实时解决方案.有两种实时,它们是非常不同的:
大多数最先进的垃圾收集器都以软实时为目标,这对桌面应用程序以及按需提供服务的服务器都有好处.如果一个人将实时作为一项要求消除,那么人们也可以使用一个世界末日的垃圾收集器,其余空间开始失去意义.(注意:主要是短期对象和高分配率的应用程序可能是一个例外,因为存活率很低.)
现在假设我们正在编写一个具有软实时要求的应用程序.为简单起见,我们假设GC在专用处理器上同时运行.假设程序具有以下人为属性:
和:
现在我们可能会看到以下分配率A的事件时间表:
分配率B的事件的时间表是不同的:
请注意分配率如何直接影响所需的净空大小?使用分配率B,我们需要两倍的净空以防止暂停并保持相同的性能水平.
这是一个非常简单的例子,旨在说明一个想法. 还有很多其他因素,但它确实显示了预期的内容.请记住我提到的另一个主要因素:平均物体寿命.寿命短导致低存活率,其与分配率一起影响维持给定性能水平所需的存储量.
简而言之,在不了解和理解应用程序的特征的情况下,不能对所需的空间进行一般性声明.
| 归档时间: |
|
| 查看次数: |
2329 次 |
| 最近记录: |