Win32 / MFC:如何找到可用的空闲内存(RAM)?

时间:2010-03-26 11:43:30

标签: windows memory mfc winapi

任何建议/提示/链接/教程将不胜感激! :)

3 个答案:

答案 0 :(得分:9)

对此真的没有答案。在正常情况下,操作系统会将某些保留在系统的基本上所有内存中。基本上,一旦它将内容读入内存,它就会在内存中保留它的副本,直到其他东西需要内存,因此第一个内存被踢出。有许多函数可以为您提供有关内存的信息,但是它们都没有尝试真正返回完全未使用的内存量。我所知道的最接近的是GlobalMemoryStatusEx,它会返回一个可用内存量的数字。

这意味着当前内存中的任何内存当前都在磁盘上的内存中,因此内存中的副本可以丢弃,而不必先将其写入磁盘。例如,如果你运行一个程序,大多数代码将保留在内存中(直到其他东西需要内存),以防你决定再次运行它。因为它只是磁盘上程序的副本,所以它可以被丢弃,并且(如果需要)在需要时从磁盘重新加载。

如果你想要更多的细节,你可以使用像VirtualQueryEx这样的东西来获取它 - 但它通常会让你重载信息,告诉你在给定过程中使用的每个内存块,而不是给出一个很好的,简单的数字,说“x字节免费”。

答案 1 :(得分:5)

GlobalMemoryStatus / GlobalMemoryStatusEx

http://msdn.microsoft.com/en-us/library/aa366586(VS.85).aspx

答案 2 :(得分:3)

这很容易回答,自由RAM总是足够接近0,认为它是零而不是麻烦。文件系统缓存始终使用未使用的RAM,您可以在Taskmgr.exe,Performance选项卡中看到这一点。

如果你的意思是“免费虚拟内存”,你只关心它的数字,那么答案就是“真的不可能”。你需要HeapWalk(),这是一个非常尴尬和危险的功能。只有HeapWalk可以检测堆中标记为空闲但仍然映射的块。无论如何,你到达的数字毫无意义。程序永远不会耗尽空闲的虚拟内存块,它总是会耗尽足够大的内存块。

检测这种情况很容易。 Malloc返回NULL,new运算符抛出std :: bad_alloc。处理这种情况并不容易。解决它需要不到200美元,大约是64位版本Windows的许可费。