5

我们有一个应用程序可能会分配大量小对象(取决于用户输入)。有时应用程序会耗尽内存并有效地崩溃。

但是,如果我们知道内存分配变得紧张,那么就会有一些优先级较低的对象可能被销毁,从而使我们能够优雅地降低用户结果。

在调用“new”实际失败之前检测进程内存不足的最佳方法是什么?我们可以调用 API 函数GetProcessWorkingSetSize()GetProcessMemoryInfo()但是您如何知道何时达到给定机器的限制(例如,最大分配的 80%)?

4

3 回答 3

5
  • 在启动时,分配一个内存储备。
  • 然后使用 set_new_handler() 安装一个检测分配失败的钩子。
  • 当一种情况发生时:
    • 释放储备(这样你就有足够的可用内存来使用)。
    • 运行查找并释放低优先级对象的代码。
    • 当它完成它的工作时,尝试再次重新分配储备(下一次)。
    • 最后返回让原来的分配尝试重试。
于 2012-08-12T14:21:46.477 回答
2

如果它是 32 位进程,那么您需要确保使用的内存不超过 1.6GB,即 2.0GB 的 80%,即您的进程所允许的最大值。调用GlobalMemoryStatusEx将填写 struct MEMORYSTATUSEX.ullAvailVirtual,当这只有 400MB 可用(或更少)时,您就处于阈值。

于 2012-08-12T12:45:36.767 回答
0

检查这个答案Win32/MFC: How to find free memory (RAM) available? .

您需要定期查找可用的空闲内存并在某个限制处停止分配。如上面提到的答案所述,您可以使用GlobalMemoryStatusEx, 和/或 VirtualQueryEx.

于 2012-08-12T12:29:00.723 回答