如何回应GCD的记忆压力通知?

Bei*_*irs 5 memory memory-management grand-central-dispatch memory-pressure ios

我正在使用GCD来获取内存压力通知.

GCD文档描述了一些常量:

DISPATCH_MEMORYPRESSURE_WARN

系统内存压力状况处于警告阶段.应用程序应该释放他们现在不需要的内存.

DISPATCH_MEMORYPRESSURE_CRITICAL

系统内存压力条件处于关键阶段.应用程序应尽可能多地释放内存.

似乎逻辑上我应该释放未使用的内存.但是,在其他地方(手册页源代码),我发现此注释与这些常量有关:

升高的内存压力是系统范围的条件,注册此源的应用程序应通过改变其未来的内存使用行为来做出反应,例如通过减少新启动的操作的高速缓存大小,直到内存压力恢复正常.

但是,当系统系统内存压力进入升高状态时,应用程序不应遍历并丢弃过去操作的现有高速缓存,因为这可能会触发VM操作,从而进一步加剧系统内存压力.

这让我很困惑.我应该释放内存,还是应该停止分配新内存?

que*_*ish 3

MacOS 有一个使用后备存储的虚拟内存 (VM) 系统:文件系统。文件系统用于保存当前未使用的内存。当系统实际内存 (RAM) 不足时,内存中未主动使用的内容可以写入磁盘并稍后加载回 RAM。

iOS 有虚拟内存系统,但没有后备存储。当内存不足时,系统会要求应用程序减少内存占用。如果这没有释放足够的内存,系统将开始杀死应用程序。

您从 libdispatch 标头引用的指导是指 MacOS 虚拟内存系统,而不是 iOS。

在 iOS 上,应用程序在处理内存警告时应丢弃对象并减少缓存大小应特别注意使用脏(不可清除)内存的对象。这是系统无法自动重用的内存 - 它必须首先被应用程序丢弃。在典型的 iOS 应用程序中,图像(图片)使用最脏的内存。