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

时间:2016-02-26 14:28:53

标签: ios memory memory-management grand-central-dispatch memory-pressure

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

GCD documentation描述了一些常量:

  

DISPATCH_MEMORYPRESSURE_WARN

     

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

     

DISPATCH_MEMORYPRESSURE_CRITICAL

     

系统内存压力状况处于关键阶段。应用   应该释放尽可能多的内存。

似乎逻辑上我应该释放未使用的内存。但是,在其他地方(man pagessource code),我发现此注释与这些常量有关:

  

内存压力升高是应用程序的系统范围   注册此来源应通过改变他们的未来作出反应   记忆使用行为,例如通过减少新发起的缓存大小   操作直到记忆压力恢复正常。

     

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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