令人困惑的 .net 内存使用

Confusing .net memory usage

一个进程内存使用情况包括(可以称为VirtualMemory):

这是我的理解:

Virtual Memory = PrivateMemmory + SharedMemory + CommitedMemory + ReservedMemory;
WorkSet Memory = PrivateMemmory + SharedMemory + CommitedMemory;
Free Memory = 'Virtual Memory' - 'WorkSet Memory';

我计算了用 c# 编写的进程(不包括保留的)的总使用内存。左边是VMMap,右边是VS Monitor。

进程总内存大小约为5GB,VMMap中保留内存约为4GB,VS Monitor显示VirtualMemorySize64约为5GB,我很困惑如何获取总使用内存。 VMMap 中有 4GB 的预留内存,我如何使用 .net Process class.

获取预留内存

我用下面的代码设置了 TotalUsageMemory 值,是否正确?

Int64 TotalUsageMemory = proc.WorkingSet64 + proc.PagedMemorySize64;

数字不是这样加起来的。页面是否在工作集中与其是否共享无关。这又是(我相信)独立于它是否被提交。

要查看的正确计数器取决于您要回答的问题。不幸的是,没有完全符合内存使用直观概念的计数器。专用字节通常用于此目的。工作集在实践中意义不大。由于 OS 操作,此计数器可能随时更改。从性能的角度来看,虚拟内存也是无关紧要的。

通常,内存使用量是启动该进程时逐渐消耗的内存。那是私有字节。

没有计数器或计算可以为您提供 TotalUsageMemory 值。