繁体   English   中英

检测内存不足之前在Windows上分配开始失败

[英]Detecting memory running low BEFORE allocations start failing on Windows

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

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

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

  • 在启动时,分配内存预留。
  • 然后使用set_new_handler()来安装将检测分配失败的钩子。
  • 当一个发生时:
    • 释放储备(这样你就有足够的可用内存)。
    • 运行查找和释放低优先级对象的代码。
    • 当它完成其工作时,尝试再次重新分配保留(下次)。
    • 最后返回让原始分配尝试重试。

如果它是一个32位进程,那么您需要确保不要使用超过1.6GB,这是2.0GB的80%,这是您的进程允许的最大值。 调用GlobalMemoryStatusEx将填充结构MEMORYSTATUSEX.ullAvailVirtual ,当这个只有400MB可用(或更少)时,你就达到了你的门槛。

检查此答案Win32 / MFC:如何找到可用的空闲内存(RAM)?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM