计算c#代码的内存使用量

时间:2014-04-18 21:42:12

标签: c# memory byte

我正在尝试监控内存使用情况。 我写了一个示例c#代码,以确定我正确测量:

var list = new List<byte[]>();
int INCREMENT = 100; // 100MB
for(int i=0; i<10; i++){
  list.Add(new byte[INCREMENT * 1024 * 1024]);// 100 MB steps
  Thread.sleep(4000);
}

我使用了任务管理器并记录了“私人工作集”的读数:

3'800k = 3.7M
3'900k = 3.8M
4'100k = 4M
4'300k = 4.2M
4'500k = 4.4M
5'200k = 5.07M
5'400k = 5.27M
5'600k = 5.47M
5'900k = 5.76M
6'100k = 5.96M

有谁知道为什么这些数字毫无意义?

3 个答案:

答案 0 :(得分:1)

不要查看“内存(私人工作集)”,而是查看“提交大小”。 您可能必须使用“/ View / Select Columns ...”添加它,然后选中“Commit Size”。 对我而言,它增加了大约1 GB,而工作集增加了3 MB。

答案 1 :(得分:1)

如果查看“任务管理器”中“内存(专用工作集)”的定义,则会显示“进程使用的物理内存量不能被其他进程使用”。这与“私有字节”非常不同,“私有字节”是其他进程无法共享的虚拟内存字节数。

您在样本中分配的数据在任何给定时间都可能得到物理内存的支持,也可能没有。这就是“记忆(私人工作集)”所反映的内容。由于你从未写过任何内存,因此Windows巧妙地决定不使用真实内存页面来支持虚拟内存。如果用数据填充数组,您将看到已分配相应的内存页。

答案 2 :(得分:0)

当我运行上面发布的代码时,我实际上看到&#34;提交大小&#34;在任务经理增加。 如果我想在sript中检索它,我需要使用wmi api。 当我使用wmi查询时,例如:

SELECT PrivateBytes FROM Win32_PerfRawData_PerfProc_Process WHERE IDProcess = 1234

它没有检测到增加。 您可以在PowerShell,python,...中运行此查询,同时测试应用程序正在运行。 如果有人也可以对此发表评论我很感激。