垃圾收集可以有效地处理真正巨大的回忆吗?

时间:2009-08-14 23:17:52

标签: language-agnostic garbage-collection

这更像是一个理论问题,而不是一个实际问题。我知道GC目前正在处理使用1,2或3 Go内存的大进程,但我想知道理论上是否可以拥有一个具有非常大内存(1000 Go或更高)的高效GC。

我问这个问题是因为,即使GC可以逐步运行其算法,它也需要等待在释放对象之前扫描所有对象,以确保没有其他对象使用它。因此,在一个非常大的系统中,逻辑上应该不那么频繁地释放内存。如果内存非常大,那么很快就会释放未使用的对象,以至于GC不再有任何兴趣。

您是否了解有关此主题的研究或文章?

6 个答案:

答案 0 :(得分:3)

有不同的算法,我所知道的都没有扫描所有内存。例如,在Java和.NET中,垃圾收集器首先假设所有对象都是垃圾。然后它识别根(总是活着的对象),并从那里走过对象图,将任何可到达的对象标记为活着。一旦标记了所有可到达的对象,它们就会被压缩,从而有效地增加了可用内存。

执行垃圾收集所需的时间因此不取决于进程所寻址的总内存,而取决于活动对象图的大小。死对象的数量完全无关紧要,因为它们甚至都没有被考虑过。

请参阅http://www.simple-talk.com/dotnet/.net-framework/understanding-garbage-collection-in-.net/以获得更好的解释。

编辑:由于作者改变了问题,这个回复有点失去了它的相关性。不过,我会把它留给文档用。

答案 1 :(得分:2)

即使应用程序使用更多内存,对象的数量也可能不会发生太大变化。它主要使用较大的物体,而不是更多的物体。

因此,扫描活动引用不会花费太长时间。它只是需要扫描的活动对象,它们之间没有任何内容。

如果有更多可用内存,GC当然会减少运行频率。收集未使用的对象没有意义,只是为了将内存使用量保持在最低限度。由于拥有大量未使用的内存,计算机运行速度不快。

答案 2 :(得分:2)

实际上,我希望垃圾收集能够在内存需求非常大的系统上获得更大的好处。我迄今为止的经验已经满足了这一点(虽然我没有达到数千GB的使用量,只有几十个)。

通常,使用大量内存的系统使用大量对象 - 因此通常会有相似数量的分配,但个别分配非常大。由于GC性能,这使得GC性能大约相当于使用较少内存量的系统。实际上与根对象的数量有关,而不是对象的总大小。

但是,当您进行非常大的内存分配时,传统系统往往会遇到大量内存碎片问题。许多垃圾收集器(虽然,不幸的是,不是.NET的大对象堆)将在收集周期中进行内存压缩,这实际上可以为大型内存使用系统提供巨大的好处,特别是随着时间的推移。

答案 3 :(得分:2)

许多系统也采用分代垃圾收集。分代垃圾收集根据它们创建的时间将对象汇集到存储桶中。理论上说,刚刚创建的对象比在内存中持续数天的内容更容易被清理。然后可以根据应用程序的内存配置文件调整垃圾收集系统。由于内存中的对象是根据它们的年龄进行分区的,因此可以更频繁地检查参考表等长期存在的东西,因此不会对垃圾收集器施加相同的负载。

雅各

答案 4 :(得分:1)

通过这个基本...关于垃圾收集

http://msdn.microsoft.com/en-us/library/ms973837.aspx

答案 5 :(得分:0)

堆内存越大,垃圾收集器的效率就越高。为了避免长时间的停顿,你需要任何合理的现代收藏家,它可以逐步增加。 (一个简单的收集器与Lua 5.1打包在一起。)

有关此内容的好文章请参阅Andrew Appel的Garbage collection can be faster than stack allocation