代码之家  ›  专栏  ›  技术社区  ›  hometoast

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

  •  0
  • hometoast  · 技术社区  · 14 年前

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

    这与我所期望的正好相反。我期望它的大小会减小,而不会增加。

    这是怎么回事?

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

    我们正在处理内存问题,但找不到它,所以绝望地添加了一个gc.collect。这样做可以减少内存的使用,但无法提供根本问题是什么的线索。

    @s.skov,每个实例的GC堆大小都是相同的。当关闭一些应用程序时,仍然打开的每个应用程序都有相同的堆大小。这使得我们在假设GC在同一程序的所有实例之间共享的情况下进行操作。我们正在使用SysInternals中的ProcessExplorer来测量堆大小。

    DR版本: 内存使用失控。collect()“修复”症状,但不是问题。同样,在同一个应用程序的所有实例中,GC堆大小总是相同的。

    抱歉:我也可能在有效地记录我们团队的讨论并在网络上挥手致意方面做得不好。

    1 回复  |  直到 14 年前
        1
  •  1
  •   S.Skov    14 年前

    你确定你真的有内存问题吗?也就是说,你是否遇到了内存不足的错误或其他“泄漏”的东西?

    如果gc.collect()修复了内存问题,那么就没有问题了。垃圾收集只在需要时发生。通常这意味着gen0和gen1会被收集很多(因为这些区域比gen2和loh小),但是gen2和loh几乎不会被GCED,除非你强迫它或者系统给应用施加压力。 根据您具体分配的内容,您可能还会看到一些完整的垃圾收集运行,这些运行压缩了各种生成堆区域,但实际上并没有释放任何内存。

    按设计,.NET应用程序会吞掉所有它能得到的内存,只有当系统告诉它停止并释放一些内存时,它才会这样做。