【问题标题】:Win32/MFC: How to find free memory (RAM) available?Win32/MFC:如何找到可用的空闲内存 (RAM)?
【发布时间】:2011-02-01 03:36:57
【问题描述】:

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

【问题讨论】:

  • 我建议您完善这个问题(或提出一个新问题)并提供更多背景信息,您想要达到什么目的,您需要了解“可用 RAM”和你的程序做了什么样的内存操作。正确地找出和解释记忆的状态并不容易。即使您知道,由于内存碎片,您也永远无法确定 malloc/new 操作是否成功。作为一名程序员,我在我的职业生涯中度过了最糟糕的时光,因为我相信:如果我的计算机中有足够的 RAM,我的内存操作就不会有问题。我错了。

标签: windows memory mfc winapi


【解决方案1】:

这个问题真的没有答案。在正常情况下,操作系统会将 something 保存在系统上的所有内存中。基本上,一旦将某些内容读入内存,它将在内存中保留一份副本,直到其他内容需要内存,因此第一个被踢出。有许多函数可以获取有关内存的信息,但它们甚至都没有尝试真正返回完全未使用的内存量。我所知道的最接近的是GlobalMemoryStatusEx,它确实返回了一个表示可用内存量的数字。

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

如果你想要更多细节,你可以使用VirtualQueryEx 之类的东西来获取它——但它通常会让你信息过载,告诉你给定进程中使用的每个内存块,而不是给出一个很好的,简单的数字表示“x bytes free”。

【讨论】:

    【解决方案2】:

    GlobalMemoryStatus/GlobalMemoryStatusEx

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

    【讨论】:

      【解决方案3】:

      这很容易回答,空闲 RAM 总是足够接近 0 以将其视为 0 而不会打扰。文件系统缓存始终使用未使用的 RAM,您可以在 Taskmgr.exe 的“性能”选项卡中看到这一点。

      如果您实际上是指“空闲虚拟内存”,即您真正关心的数字,那么答案是“不太可能”。您需要 HeapWalk(),这是一个非常笨拙且危险的函数。只有 HeapWalk 可以检测堆中标记为空闲但仍被映射的块。无论如何,您到达的数字毫无意义。一个程序永远不会用完空闲的虚拟内存块,它总是先用完足够大的内存块。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多