我正在调试与我们拥有的托管应用程序相关的一些内存问题。当我对所有堆中的 .NET 字节和进程资源管理器中报告的工作集(任务管理器中的内存使用列)之间的内存差异感到困惑时,我正在使用 perfmon 监视应用程序。所有堆计数器中的字节数显示值为 15MB,而进程工作集为 78MB - 差别很大。我知道加载到内存中的文件会消耗一些内存,但这些数字仍然没有加起来。
有什么线索吗?
本文很好地概述了各种内存计数器。
工作集——这是一个进程的一组虚拟内存页面(已提交),位于物理 RAM 中。工作集就像“当前/最近在这些页面上工作”列表
根据您的问题描述,您似乎有大约。正在使用 63MB 的非托管内存。
尝试使用 FXCop。查看有关在 IDisposable 类型上调用 dispose 失败的规则。
.net 内存泄漏的主要原因有两个,一个是调用 IDisposable 失败(这是一种为 P/Invoke 代码调用非托管析构函数的技术),第二个是未能释放对对象的引用,这导致它们不垃圾收集。例如,如果您将对象存储在列表中,您可能会不小心保留对列表的引用,因此对象仍在内存中。
Rico Mariani 的 Performance Tidbits 博客文章Tracking down managed memory leaks (how to find a GC leak)并不能直接回答您的问题 re: Bytes in All Heaps and the Working Set,但它应该对您的任务 re:debugging some memory 问题有很大帮助与托管应用程序相关。
您可能还想查看为了更好地使用内存而避免的两件事和追踪由于未处理对象而导致的内存泄漏的三种技术。
所有的文章都很老了,但是提供的信息应该仍然对您有所帮助。