【问题标题】:calculating memory usage of c# code计算c#代码的内存使用情况
【发布时间】:2014-06-03 11:28:07
【问题描述】:

我正在尝试监控内存使用情况。 我编写了一个示例 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

有人知道为什么这些数字没有意义吗?

【问题讨论】:

  • 它们完全有道理。我不明白这个问题。
  • 您每 4 秒填充一次列表,您的内存也在相应增长。似乎有什么问题?
  • 为什么内存增加了 0.2 MB 而不是 100MB?

标签: c# memory byte


【解决方案1】:

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

【讨论】:

  • 只是补充一下,尝试查看this page 以了解这些内容的含义。另外,请尝试查看SO Question,其中 Lars 很好地解释了这些东西在更好的英语中的含义。
  • 谢谢。任务管理器中所谓的“提交大小”是有意义的。现在,我试图从 wmi 中检索它,但 Win32_PerfRawData_PerfProc_Process 类没有这样的属性。 Win32_PerfRawData_PerfOS_Memory 类具有这样的属性,但它是一个全局值 - 不是特定于进程的。有任何想法吗?见:msdn.microsoft.com/en-us/library/aa394323(v=vs.85).aspx
  • 来自 Icemanind 的链接,Memory-Commit Size 与 Virtual Memory 相同。但是当我用 wmi 监控 VirtualBytes 时,它并没有改变。
【解决方案2】:

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

在任何给定时间,您在示例中分配的数据可能有也可能没有物理内存支持。这就是“内存(私有工作集)”所反映的。由于您从不写任何内存,Windows 巧妙地决定不使用实际内存页面支持虚拟内存。如果你用数据填充数组,你会看到分配了相应的内存页。

【讨论】:

  • 您的评论很有道理。我的目标是使用 wmi 来检测内存问题,我猜未分配的(虚拟)内存也是一个潜在的问题,并且很容易监控。你同意吗?
  • 我不确定你的意思。这里的要点是,当您在示例中分配内存时,内存被保留,但未提交,这就是为什么您看不到任务管理器报告的预期增加。如果/当您写入内存时,它会被提交,因此您会在任务管理器报告的数字中看到这一点。
【解决方案3】:

当我运行上面发布的代码时,我实际上看到任务管理器中的“提交大小”增加了。 如果我想在 sript 中检索它,我需要使用 wmi api。 当我使用这样的 wmi 查询时:

从 Win32_PerfRawData_PerfProc_Process WHERE IDProcess=1234 中选择 PrivateBytes

它没有检测到增加。 您可以在测试应用程序运行时在 powershell、python 中运行此查询。 如果有人也可以对此发表评论,我将不胜感激。

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 2016-08-29
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    相关资源
    最近更新 更多