在 Windows 機制裡面,將在實體記憶體、換頁池、非換頁池以及提交用量很多或很少時,向使用者模式程序和核心模式驅動程式提供通知。本文將重點放在使用者模式的程序上
本文屬於讀 《深入解析 Windows 作業系統》 讀書筆記
應用程式可以呼叫 CreateMemoryResourceNotification function 函式指定自己期望接收到記憶體多或記憶體少的通知
如在 dotnet 的 CLR 層的 finalizerthread 部分,就使用了以下程式碼進行獲取通知
MHandles[kLowMemoryNotification] =
CreateMemoryResourceNotification(LowMemoryResourceNotification);
以上的引數的 LowMemoryResourceNotification 表示的是可用實體記憶體不足。對應的還有 HighMemoryResourceNotification 表示可用實體記憶體很高
配合 QueryMemoryResourceNotification function 可以進行查詢當前的記憶體狀態
使用例子程式碼請參閱 https://stackoverflow.com/a/54529790 提供的例子
另一個方面則是透過以下記憶體管理器的通知事件獲取通知
-
HighCommitCondition: 如果提交用量接近最大提交限制,即記憶體用量非常大,實體記憶體或頁面檔案中可用空間極為有限,且系統無法增加頁面檔案的大小,將設定此事件。換句話就是記憶體用多了,能釋放的話趕緊釋放
-
LowCommitCondition: 當提交用量相對於當前提交限制較低,即記憶體用量低,且實體記憶體或頁面檔案存在大量可用空間時,將設定該事件。換句話說就是現在豪氣,隨便用
-
HighMemoryCondition: 當空閒實體記憶體數量超過預設值時將設定該事件
-
LowMemoryCondition: 當空閒實體記憶體數量低於預設值時將設定該事件
如果要檢視記憶體資源通知事件,可以執行微軟極品工具箱的 WinObj 工具,檢視 KernelObjects 資料夾裡面的大記憶體和小記憶體事件,如下圖所示
雙擊即可看到對應的物件產生了多少控制代碼和引用
如果想要了解系統中有哪些程序請求了記憶體資源通知,可以使用 Process Explorer 的 Find 選單進行搜尋控制代碼表,如下圖
更詳細內容請大家自行閱讀書籍
參考文件:
- CreateMemoryResourceNotification function (memoryapi.h) - Win32 apps Microsoft Learn
- QueryMemoryResourceNotification function (memoryapi.h) - Win32 apps Microsoft Learn