簡體   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