首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET垃圾收集。内存泄漏。使用私有字节的GBs的进程GC .NET内存计数器只显示几个MBs

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

Stack Overflow用户
提问于 2014-11-06 19:25:02
回答 1查看 890关注 0票数 1

最初,我不相信perfmon集合返回的结果,因为这个进程似乎存在内存泄漏。

进程的Private值超过了一个gig。

因此,我怀疑垃圾回收无法清除内存,因为有东西正在保存引用,比如收集等等。

但是,.NET内存计数器显示了Gen 0、1、2堆大小的意外值。

例如,perfmon在所有堆中为# Bytes带来的值仅为几百万字节(即几个MBs)。大物体的尺寸也很小。

我承认我有点困惑。我假设这意味着内存分配在托管内存之外,还是一个bug?

编辑

  1. 有一点我忽略了,那就是GC已经有好几个星期没有被调用了。
  2. 我有一个大约一周前捕获的VMMap输出,我对再次在prod中运行VMMap很谨慎,所以我不能再次捕获(除非有人知道VMMap有多安全?)

对于托管堆,我的VMMap显示了接近90万KB的大小,超过50万KB的Private,当我看到perfmon值时,这让我感到很奇怪。

EN

回答 1

Stack Overflow用户

发布于 2014-11-06 23:17:39

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

此外,CLR以称为段的块分配托管堆的存储空间。托管堆基本上是段的集合。CLR根据需要分配和释放这些段。在任何给定的时间点,托管堆上通常都会有“空闲”空间。也就是说,段贡献了私有字节数,但是CLR认为内存是空闲的。

你首先要做的应该是弄清楚是什么样的记忆占据了空间。如果是托管内存,则可以使用内存探查器或调试器(如WinDbg/SOS )检查托管堆。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26787758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档