【问题标题】:How to respond to memory pressure notifications from GCD?如何响应来自 GCD 的内存压力通知?
【发布时间】:2016-06-09 19:42:03
【问题描述】:

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

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

DISPATCH_MEMORYPRESSURE_WARN

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

DISPATCH_MEMORYPRESSURE_CRITICAL

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-12
      • 1970-01-01
      • 2014-02-14
      • 2013-11-17
      • 2020-12-03
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      相关资源
      最近更新 更多