关闭应用程序的一些实例,增加Gen-2垃圾收集堆?

时间:2010-05-13 13:42:25

标签: .net garbage-collection clr

我们正在调试一些内存问题。我们看了同一个应用程序的5个实例。我们停止了3. Gen2堆大小从大约5M到大约10M,Gen0和Gen1堆大小变化不大。

这与我的期望完全相反。我预计它会减小尺寸,并且永远不会期望它会增加。

这里发生了什么?

更多细节: 这些是控制台应用程序,相同的物理.exe,不同的命令行,都做简单的“读取文件,插入数据库”(或反之亦然)工作。

我们遇到了内存问题但无法找到它,所以在绝望中在每次批处理运行后添加了GC.Collect。这样做已经减轻了内存使用量,但没有提供根本问题的线索。

@ S.Skov,GC堆大小对于每个实例都是相同的。关闭某些应用程序时,每个仍然打开的应用程序都具有相同的堆大小。这使我们在假设GC在同一程序的所有实例之间共享的情况下运行。我们使用sysinternals中的Process Explorer来测量堆大小。

tl; dr版本:内存使用情况失控。 GC.Collect()“修复”症状但不是问题。此外,GC堆大小在同一应用程序的所有实例中始终相同。

道歉:我也可能在有效地转录我们团队的讨论并在网上挥手致意地做一些糟糕的工作。

1 个答案:

答案 0 :(得分:1)

你确定你确实遇到了内存问题 - 即你是否遇到了内存不足或其他“漏洞”的问题?

如果GC.Collect()修复了内存问题,那么就没有问题了。垃圾收集仅在需要时才会发生。通常这意味着Gen0和Gen1将被收集很多(因为这些区域与Gen2和LOH相比较小),但Gen2和LOH几乎从不会被GC,除非你强制它或系统压力app。  根据您正在分配的内容,您可能还会看到一些完整的垃圾收集运行,这些运行会压缩各种生成堆区域,但实际上并没有释放任何内存。

通过设计,.NET应用程序将吞噬所有可以让它变得油腻的内存,并且只有当系统告诉它停止并释放其中一部分时,才会这样做。