我正在调试与我们拥有的托管应用程序相关的一些内存问题。当我对所有堆中的.NET字节与Process Explorer中报告的工作集(在任务管理器的情况下为Mem Usage列)之间的内存差异感到困惑时,我正在使用perfmon监视应用程序。所有堆计数器中的字节值显示为15MB,而过程工作集为78MB - 这是一个巨大的差异。我知道在内存中加载的文件中会消耗一些内存,但数字仍然没有加起来。
任何线索?
答案 0 :(得分:1)
这个article很好地概述了各种内存计数器。
工作集 - 这是一组虚拟内存页面(即 承诺)为一个过程而且是 位于物理RAM中。一个工作 set就像是“目前/最近 在这些页面上工作“列表
从您的问题描述中,您似乎有约。正在使用63MB的非托管内存。
答案 1 :(得分:1)
尝试并开始使用FXCop。查看有关未在IDisposable类型上调用dispose的规则。
.net中存在内存泄漏的两个主要原因,即无法调用IDisposable(这是一种将为P / Invoke代码调用非托管析构函数的技术),第二种是无法释放对象的引用,这导致他们不垃圾收集。例如,如果要将对象存储在列表中,则可能会意外地保留对列表的引用,从而保留对象仍然在内存中。
答案 2 :(得分:1)
Rico Mariani的Performance Tidbits博客文章Tracking down managed memory leaks (how to find a GC leak)并未直接回答您的问题:所有堆中的字节和工作集,但它应该对您的任务有很大帮助:调试与托管应用程序相关的一些内存问题
您可能还想查看Two things to avoid for better memory usage和Three techniques for tracking down memory leaks due to undisposed objects。
所有文章都很陈旧,但所提供的信息仍然对您有所帮助。