如何像 Windows 任务管理器中显示的那样获得可用的物理内存

Posted

技术标签:

【中文标题】如何像 Windows 任务管理器中显示的那样获得可用的物理内存【英文标题】:How to get free physical memory like the one showing in Windows Task Manager 【发布时间】:2012-05-01 07:28:11 【问题描述】:

我在获取“可用”物理内存时遇到了问题,就像 Windows 任务管理器中显示的那样。无论我在哪里搜索,最终都会得到“可用的”物理内存,这不是我的意图。

有人知道如何获得“免费”物理内存吗?

【问题讨论】:

为什么需要这些信息?你想解决什么问题? 我想检查空闲内存是否低于 1000。如果是,那么我不希望我的程序运行多个进程,而是等到空闲内存高于 1000 :) 嗯,这似乎不是一个好主意。我的计算机中有 16 GB 的 RAM,尽管有 6 到 10 GB 的“可用”内存,但我几乎从未在任务管理器中显示超过 100 MB 的“可用”内存。 Windows 只是为此过于积极地缓存。它有充分的理由这样做——“免费”内存只是被浪费了。为什么不想使用“可用”内存指标? 如果我运行一个优先级低于正常且空闲物理内存为1的进程会发生什么,例如1,用户会遇到该进程导致的任何缺失吗? Read this。如果你需要一个内存,分配它。如果您害怕降低工作站速度并降低这样做的用户体验,请在服务器上运行它。 【参考方案1】:

您可能需要GlobalMemoryStatusEx 函数。请参阅 http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/01371e94-0ef4-43a8-9fcb-f3ec40e8675e/ 以获取从 C# 中使用它的示例。

您可能还会发现http://www.pinvoke.net/default.aspx/kernel32.globalmemorystatusex 很有用。

【讨论】:

具体来说,MEMORYSTATUSEX结构的哪些成员包含任务管理器中“Free”值对应的值?还是您建议他完全放弃并使用dwMemoryLoad 成员作为他的标准? 文档示例将ulAvailPhys 成员报告为可用内存量。 MEMORYSTATUSEX 的文档将此成员描述为“当前可用的物理内存量,以字节为单位。这是可以立即重用的物理内存量,而无需先将其内容写入磁盘。它是大小的总和备用列表、空闲列表和零列表。” 我尝试了 pinvoke.net 中的示例,但得到了一些与 Windows 任务管理器中的可用物理内存不匹配的奇怪数字【参考方案2】:

我完全忽略了您需要空闲内存,而不是可用内存,所以我的回答是错误的,对不起。但是这个数字并不意味着什么,因为用于缓存的内存将会减少,看看 windows vista, 7 内存管理器是如何工作的:

http://www.codinghorror.com/blog/2006/09/why-does-vista-use-all-my-memory.html

您可以使用 GetPerformanceInfo windows API,它显示的值与 Windows 7 上的 Windows 任务管理器完全相同,请查看我对类似问题的 SO 回答:

C# Get used memory in %

或者下载Top Process的源码,这是一个显示空闲内存和CPU使用情况的小软件,它是开源的,完全免费的,我应该说是我写的:)

【讨论】:

这并没有给我可用的物理内存。我尝试使用 GetPerformanceInfo 和 PerformanceCounter,但这些都没有让我获得免费的可用内存。 PhysicalTotal - PhysicalAvailable = 免费 我的windows任务管理器里有这些信息:物理内存(MB)总计8103缓存2184可用5775空闲3674,怎么总-可用=免费? 好吧,我不知道如何解释,您从 GetPerformaceInfo 中获取值 PhysicalTotal PhysicalAvailable 并减去它,您是否尝试过我链接的帖子中的代码? 是的,和你之前提到的一样 :) 你提供的链接只给出了可用的结果,总数和使用百分比,但我需要可用的物理内存。如果我使用可用内存,windows 将与虚拟交换,这最终会给具有一些低性能硬件(如 1 或 2 gb ram、双核奔腾处理器等)的计算机带来一些轻微的缺乏经验。如果我能得到可用的物理内存,我可以使用这些数字来确定应用程序是否应该运行,这样它就不会干扰用户使用计算机的体验

以上是关于如何像 Windows 任务管理器中显示的那样获得可用的物理内存的主要内容,如果未能解决你的问题,请参考以下文章

如何在windows任务管理器中查找oracle.exe进程对应实例

从任务管理器中隐藏 C# 程序?

windows任务管理器中查看选项中的“显示内核时间”是啥意思?啥是“内核时间”?

如何在任务管理器中添加名称到程序

在任务管理器中显示所有CPU内核性能

esxi6.7 为啥虚拟机多核cpu 任务管理器中只显示两个cpu