最初,我不相信perfmon集合返回的结果,因为这个进程似乎存在内存泄漏。
进程的Private值超过了一个gig。
因此,我怀疑垃圾回收无法清除内存,因为有东西正在保存引用,比如收集等等。
但是,.NET内存计数器显示了Gen 0、1、2堆大小的意外值。
例如,perfmon在所有堆中为# Bytes带来的值仅为几百万字节(即几个MBs)。大物体的尺寸也很小。
我承认我有点困惑。我假设这意味着内存分配在托管内存之外,还是一个bug?
编辑
对于托管堆,我的VMMap显示了接近90万KB的大小,超过50万KB的Private,当我看到perfmon值时,这让我感到很奇怪。
发布于 2014-11-06 23:17:39
托管堆始终是私有字节的子集。私有字节是进程请求的内存量。这包括运行时本身完成的本机分配或进程加载的任何其他模块。
此外,CLR以称为段的块分配托管堆的存储空间。托管堆基本上是段的集合。CLR根据需要分配和释放这些段。在任何给定的时间点,托管堆上通常都会有“空闲”空间。也就是说,段贡献了私有字节数,但是CLR认为内存是空闲的。
你首先要做的应该是弄清楚是什么样的记忆占据了空间。如果是托管内存,则可以使用内存探查器或调试器(如WinDbg/SOS )检查托管堆。
https://stackoverflow.com/questions/26787758
复制相似问题