5

我正在使用GCD來獲取內存壓力通知。如何迴應GCD的記憶壓力通知?

GCD documentation描述了一些常量像這樣:

DISPATCH_MEMORYPRESSURE_WARN

系統存儲器壓力條件是在警告階段。應用程序 應該釋放他們現在不需要的內存。

DISPATCH_MEMORYPRESSURE_CRITICAL

系統存儲器壓力條件是在關鍵階段。應用程序 應釋放盡可能多的內存。

似乎合乎邏輯,我應該釋放未使用的內存。然而,在其他地方(man pagessource code)我覺得這注有關這些常量:

高架內存壓力是一個全系統的條件,爲了這個源註冊的應用程序 應該通過改變他們的未來 記憶反應使用行爲,例如通過減少新啓動的 操作的緩存大小,直到內存壓力恢復正常。

然而,應用程序應該不橫過並丟棄對於過去操作現有緩存 當系統系統TEM存儲器壓力下進入 升高的狀態,因爲這很可能引發VM操作該 將進一步進一步療法加重系統內存壓力。

這使我困惑。那麼我應該釋放內存,還是應該停止分配新內存?

回答

0

MacOS有一個使用後備存儲的虛擬內存(VM)系統:文件系統。文件系統用於保存當前未使用的內存。當系統在實際內存(RAM)上運行時,內存中未被使用的內容可以寫入磁盤並稍後加載回RAM中。

iOS有一個虛擬內存系統,但沒有後備存儲。當內存不足時,系統會要求應用程序降低內存佔用量。如果這不能釋放足夠的內存,系統將開始殺死應用程序。

您從libdispatch頭引用的指導是指MacOS虛擬內存系統,而不是iOS。

在iOS上的應用應該放棄的對象減少緩存大小處理內存警告的時候。應特別注意使用髒(不可清除)內存的對象。這是系統不能自動重用的內存 - 它必須首先被應用程序丟棄。在典型的iOS應用程序中,圖像(圖片)使用最髒的內存。