【问题标题】:Getting process ram usage in megabytes以兆字节为单位获取进程内存使用情况
【发布时间】:2017-05-17 19:00:01
【问题描述】:

我正在尝试检索我的控制台应用程序的 ram 使用情况,为此我正在使用:

var ramUsage = Process.GetCurrentProcess().WorkingSet64;

但是WorkingSet64 返回的值非常大,我认为这些是 kbs,但我不是 100% 确定我需要将数字除以 1024 以获得兆字节还是需要除以1024*1024 ?

谁能解释一下Process.WorkingSet64返回的值到底是什么。

【问题讨论】:

  • “工作集”确实在 Windows 上具有特定含义(您可以使用 Google 找到),但该含义与作为应用程序开发人员的您并不特别相关。在像 .NET 这样的垃圾收集环境中,在具有大量额外内存的系统上,工作集可能会变得非常大,并且无法反映应用程序实际需要多少内存。你想用这个值做什么?如果您尝试分析内存使用情况,则需要使用实际的内存分析器。

标签: c# memory process ram


【解决方案1】:

根据the documentation,此属性返回的数字以字节为单位。

因此,要将其转换为千字节,您需要将其除以 1024。要将其转换为兆字节,您需要将其除以 10242。以此类推。

【讨论】:

  • 在这种情况下,我们需要除以 1024*1024 来获得以 mb 为单位的 ram 使用量吗?
  • @dB.Employee 从技术上讲是的,但要小心,因为内存使用量是 1024 还是 1000 存在争议:P
  • 没有争议。 Windows 明确使用二进制表示,1 KB == 1024 字节。
  • 我同意这里没有争议,2 的幂用于计算机等数字设备,如果我没记错的话,像 1000 这样的整数仅用于模拟设备。
【解决方案2】:

Process.WorkingSet64 属性以字节为单位返回。 根据有关该属性的 MSDN 文章:

物业价值 类型:System.Int64

为相关进程分配的物理内存量(以字节为单位)。

https://msdn.microsoft.com/en-us/library/system.diagnostics.process.workingset64%28v=vs.110%29.aspx

在 Windows 中,为了获得以兆字节为单位的值,你是正确的,因为你除以 1024 * 1024

var ramAllocation = Process.GetCurrentProcess().WorkingSet64;
var allocationInMB = ramUsage / (1024 * 1024);

旁注:Windows 使用 JEDEC 标准,其中 1 KB = 1024 字节。 IEC 标准定义 1 千字节 = 1000 字节和 1 千字节 = 1024 字节。 10.6 之后的 OSX 使用 ICE 兆字节,因此 1 KB = 1000 字节。一些 Linux 发行版,如 10.10 之后的 Ubuntu,使用 ICE 前缀(1 兆字节 = 1024 千字节,1 兆字节 = 1000 千字节)。这就是为什么有时当您购买硬盘时,它在 Windows 中 (1MB = 1024kB) 似乎比宣传的大小(通常 1MB = 1000 kB)要小。

此外,Cody Gray 指出这是分配字节数,而不是使用字节数。操作系统分配的内存比程序使用的确切字节数要多,通常不会在内存不使用后立即回收。

【讨论】:

  • Windows 使用JEDEC 100B.01 标准,即千字节 (KB) 为 1024 字节。为什么不使用千字节?因为那个单位直到 1998 年才成立,而且 Windows 不得不在 1998 年之前很长一段时间内决定使用哪个前缀。即使他们要克服 kibi- 前缀的事实听起来很愚蠢,没有人真正使用它,这只会影响用户界面中的演示。 API 无法更改。 HDD 这样做只是出于营销原因。
  • @CodyGray 我编辑了我的答案,所以更清楚的是这是由于不同的标准而不是由于任何错误,例如。在实施、设计中。我也同意这是愚蠢的,但它仍在使用并被 IEEE、NIST、欧盟标准采用以使用这两个前缀。
猜你喜欢
  • 2012-11-07
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2010-10-24
  • 2012-02-17
  • 2011-11-05
  • 2015-03-11
  • 1970-01-01
相关资源
最近更新 更多