【问题标题】:Confusing .net memory usage令人困惑的 .net 内存使用情况
【发布时间】:2025-12-04 15:50:01
【问题描述】:

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

  • PrivateMemory:专用于一个进程,不能被其他进程共享。
  • SharedMemory:运行时或第三个链接库。
  • 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 类获取预留内存。

我用下面的代码设置了 TotalUsageMemory 值,对吗?

Int64 TotalUsageMemory = proc.WorkingSet64 + proc.PagedMemorySize64;

【问题讨论】:

  • 您的问题是什么? “我用下面的代码设置了 CurrentMemory 值,是否更正了?”或者为什么你有这么多内存使用?
  • 不,这很荒谬,你会计算两次相同的内存。在像 Windows 这样的按需页面虚拟内存操作系统上,“内存”这个词太模糊了。追求 VMMap 编号并不是很有用,其中有一堆由所有进程共享,因此不能完全代表您放在机器上的“负载”。 Process.PrivateMemorySize64 是一个不错的衡量标准。
  • @podosta 我更新了这个问题。我想获取一个进程的总使用内存(有内存地址,只声明没有地址的保留内存),VMMap 有 4GB 的保留内存,但是 .net Process 类只告诉我虚拟内存,工作集内存、私有内存、分页内存。

标签: c# .net memory clr


【解决方案1】:

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

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

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

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

【讨论】: