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

时间:2011-01-31 18:31:09

标签: garbage-collection

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

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

4 个答案:

答案 0 :(得分:8)

答案 1 :(得分:4)

根据2005年的研究量化垃圾收集与显式内存管理的性能 (PDF),分代垃圾收集器需要5倍的内存才能达到相同的性能。以下重点是我的:

  

我们将显式内存管理与一系列基准测试中的复制和非复制垃圾收集器进行比较,并包括验证结果的真实(非模拟)运行。这些结果量化了垃圾收集的时空权衡:具有五倍的内存,具有非复制成熟空间的Appel风格的分代垃圾收集器与显式内存管理的性能相匹配。仅与内存的三倍,显然比显式内存管理慢17%。但是,内存只有两倍,垃圾回收   使性能降低近70%。当物理内存不足时,分页会导致垃圾收集比显式内存管理慢一个数量级。

答案 2 :(得分:3)

我希望原作者明确标明他们认为垃圾收集的正确用法及其声明的背景。

开销肯定取决于很多因素;例如,如果不经常运行垃圾收集器,则开销会更大;复制垃圾收集器的开销高于标记和扫描收集器;在单线程应用程序中编写垃圾收集器比在多线程环境中编写更容易,尤其是对于任何移动对象的东西(复制和/或压缩gc)。

答案 3 :(得分:3)

  

所以我想知道是否有任何研究或实际数量的垃圾收集开销。

大约10年前,我研究了两个用C ++编写的等效程序,使用STL(Linux上的GCC)和OCaml使用垃圾收集器。我发现C ++平均使用了2倍的内存。我尝试通过编写自定义STL分配器来改进它,但从未能够匹配OCaml的内存占用。

此外,GC通常会进行大量压缩,从而进一步减少内存占用。因此,我会质疑与典型的非托管代码相比存在内存开销的假设(例如,使用现在的标准库集合的C ++)。