6

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

GCD 文档描述了一些常量,如下所示:

DISPATCH_MEMORYPRESSURE_WARN

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

DISPATCH_MEMORYPRESSURE_CRITICAL

系统内存压力情况处于临界阶段。应用程序应该尽可能多地释放内存。

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

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

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

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

4

1 回答 1

3

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

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

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

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

于 2018-01-27T02:28:17.640 回答