我们有一个应用程序可能会分配大量小对象(取决于用户输入)。有时应用程序会耗尽内存并有效地崩溃。
但是,如果我们知道内存分配变得紧张,那么就会有一些优先级较低的对象可能被销毁,从而使我们能够优雅地降低用户结果。
在调用“new”实际失败之前检测进程内存不足的最佳方法是什么?我们可以调用 API 函数GetProcessWorkingSetSize()
,GetProcessMemoryInfo()
但是您如何知道何时达到给定机器的限制(例如,最大分配的 80%)?
我们有一个应用程序可能会分配大量小对象(取决于用户输入)。有时应用程序会耗尽内存并有效地崩溃。
但是,如果我们知道内存分配变得紧张,那么就会有一些优先级较低的对象可能被销毁,从而使我们能够优雅地降低用户结果。
在调用“new”实际失败之前检测进程内存不足的最佳方法是什么?我们可以调用 API 函数GetProcessWorkingSetSize()
,GetProcessMemoryInfo()
但是您如何知道何时达到给定机器的限制(例如,最大分配的 80%)?
如果它是 32 位进程,那么您需要确保使用的内存不超过 1.6GB,即 2.0GB 的 80%,即您的进程所允许的最大值。调用GlobalMemoryStatusEx
将填写 struct MEMORYSTATUSEX.ullAvailVirtual
,当这只有 400MB 可用(或更少)时,您就处于阈值。
检查这个答案Win32/MFC: How to find free memory (RAM) available? .
您需要定期查找可用的空闲内存并在某个限制处停止分配。如上面提到的答案所述,您可以使用GlobalMemoryStatusEx
, 和/或 VirtualQueryEx
.