.NET垃圾收集。内存泄漏。使用GB的私有字节进程但GC .NET内存计数器只显示几MB

时间:2014-11-06 19:25:02

标签: .net memory-management memory-leaks garbage-collection perfmon

我最初不信任针对一个似乎有内存泄漏的进程的perfmon集合返回的结果。

该过程的私有字节值超过了演出。

所以我怀疑垃圾收集无法清除内存,因为有些东西像集合一样打开引用等。

然而,.NET内存计数器显示Gen 0,1,2堆大小的意外值。

值perfmon为所有堆中的#字节带回来,例如只有几百万字节(即几MB)。大对象尺寸也非常小。

我承认我有点困惑。 我认为这意味着内存分配不在托管内存中,或者它是一个错误?

修改

  1. 我遗漏的一个重要问题是GC已经被调用了好几周

  2. 我有一个大概前一周捕获的VMMap输出,我对再次运行VMMap很警惕,所以我再也无法捕获(除非有人知道VMMap的安全性如何?)

    < / LI>

    我的VMMap显示托管堆的大小接近900,000 KB,超过500,000 KB私有字节,当我看到perfmon值时,这让我感到奇怪。

1 个答案:

答案 0 :(得分:2)

托管堆将始终是专用字节的子集。专用字节是进程要求的内存量。这包括由运行时本身或由进程加载的任何其他模块完成的本机分配。

此外,CLR在称为段的块中为托管堆分配存储。托管堆基本上是一组段。 CLR根据需要分配和释放这些段。在任何给定的时间点,托管堆上通常都会有“空闲”空间。即这些段有助于私有字节数,但CLR认为内存是空闲的。

你的第一个动作应该是弄清楚占用空间的是什么样的记忆。如果是托管内存,则可以使用内存分析器或调试器(如WinDbg / SOS)检查托管堆。