令人困惑的 .net 内存使用
Confusing .net memory usage
一个进程内存使用情况包括(可以称为VirtualMemory):
- PrivateMemmory:专用于一个进程,不能被其他进程共享。
- SharedMemory:运行时或第 3 个链接库。
- CommitedMemory [或PagedMemory]:映射到硬盘上。 (准备使用)
- ReservedMemory:仅声明(不存在且无地址)。
这是我的理解:
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
值。
一个进程内存使用情况包括(可以称为VirtualMemory):
- PrivateMemmory:专用于一个进程,不能被其他进程共享。
- SharedMemory:运行时或第 3 个链接库。
- CommitedMemory [或PagedMemory]:映射到硬盘上。 (准备使用)
- ReservedMemory:仅声明(不存在且无地址)。
这是我的理解:
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
值。