【问题标题】:How can I get rid of resident dirty memory in Objective-C?如何摆脱 Objective-C 中的常驻脏内存?
【发布时间】:2011-07-22 18:57:50
【问题描述】:

我观看了 Apple 的 WWDC 2010 视频,介绍了使用 Instruments 进行高级内存分析,从中我发现了很多常驻脏内存。我意识到拥有如此多的常驻脏内存是一件坏事(可能是我的应用程序崩溃如此之多的解释......),但我不知道如何解决它。我应该去哪里看?

仪器向我显示了很多可能有用的信息,但在我看来这些信息是胡言乱语,例如:

% of Res  Type                      Resident Size
18%       VM_ALLOCATE (8192 pages)  32.00 MB

这属于“脏”类别 - 32 MB 的常驻脏内存在只有 256 MB 的设备上是很多的,对吧? :) 还有几个像这样的大块。如何从 Instruments 追溯到我的代码?还是我应该忘记 Instruments 并在我的代码中查找特定问题?

【问题讨论】:

  • 您的数据是来自模拟器还是设备上运行应用程序?
  • Steve - 我都做过,但我相信上面显示的数据来自模拟器。

标签: objective-c xcode ios instruments


【解决方案1】:

“这属于“脏”类别 - 32 MB 常驻脏内存...” “我还注意到一个 32 MB 的 VM_ALLOCATE 块,我想知道......”

当我在模拟器中分析我的应用程序时,我在 VM 跟踪器中看到相同的“VM_ALLOCATE(8192 页)32 MB”,用于驻留、脏和虚拟列。

为了比较,我对 Paul Hegarty 的 very 信息丰富的 iTunes U 斯坦福课程(例如,心理学家和图形计算器)构建的(较小的)演示应用程序进行了概要分析,并在每个。

我是一个“领域人”,对内存管理的细节还没有深入的了解,所以我无法提供权威的解释,但似乎可以合理地得出结论,这种分配是由于元素造成的模拟器上运行的所有应用程序共有的框架。 (我没有在设备上运行它们。)

(仅供参考:运行 10.7.3 的 MacBook Pro 上的 Xcode 4.3)

【讨论】:

    【解决方案2】:

    在设备或模拟器上运行时,您是否看到这 32 MB 的 VM_ALLOCATE 块?

    我问是因为当我在我正在开发的 OS X 应用程序上使用分配工具时,我还注意到一个 32 MB 的 VM_ALLOCATE 块,我想知道这是否是在OS X 环境。在设备上运行可能会给你一个不同的数据集。

    不过,一般来说,常驻内存是您的应用正在使用的未换出到磁盘的内存。在 iOS 上,没有交换,因此常驻内存应该等于您的虚拟内存占用量。

    脏内存是您分配和使用的内存。脏内存应该小于常驻内存,因为后者包括代码(你的和框架的)。

    我不确定您在应用程序中究竟在做什么,但我猜您已经从捆绑包中加载了一些大型资产并保留了它们。尽可能不要这样做。

    在加载 NSData 对象时,您还可以使用一些 API,这些 API 使用内存映射技术而不是暴力读取字节。这些可能会更好,因为它允许操作系统懒惰地从磁盘读取页面。使用 NSData(因为它是不可变的),它也可能足够聪明地将页面标记为只读。从理论上讲,这对操作系统来说是一个有价值的提示,它可以在压力下清除这些页面,因为它知道它们无法更改。阅读+[NSData dataWithContentsOfMappedFile:] 的文档。

    对于图片,我记得读过一些建议避免使用 imageNamed: 的内容,除了您经常通过应用程序使用的图片(即 UI 元素)。特别是对于大图像,它们可以保留在您无法控制的缓存中。 (imageNamed: 在 2.x 的日子里发生了泄漏,但它在 3.x 中得到了修复,现在可以完全安全地使用。)对于较大的图像和不是 UI 中重复出现的图像,请使用 imageWithContentsOfFile: .

    如果您从网络加载图像,请将它们缓存在磁盘上并在创建 UIImage 后释放原始字节。如果图像视图由于内存压力而被卸载,您不想再次访问网络来加载数据,但您也不想保留两个副本(NSDataUIImage)已加载。

    【讨论】:

    • +1。在快速循环许多 UIImages 时切换到imageWithContentsofFile: 可以防止我的虚拟内存以imageNamed: 的方式增加。不再有内存不足警告!谢谢!
    【解决方案3】:

    在仪器中单击自动启用快照 将视图模式更改为区域地图。 在文件的路径名中查找,当您的应用程序位于 vmpages 中时,您正在使用这些文件名 当你清除它之后。 在视频 wwdc 示例中,他们对文件使用加密,这是将其推送到 vmpages,没有 u 代码太难提出比 [library flush] 更多的建议 :-)

    【讨论】:

      【解决方案4】:

      使用新的 xCode 4,来自 xCode 3 的工具仍然存在,具有更好的用户界面来分析您的应用程序,包括泄漏和内存使用情况。我建议您查看这些工具并一一运行以查看它们为您提供了什么。您可以在 xCode 4 的主菜单 Product 中访问这些工具,然后 -> Profile

      希望对你有帮助

      【讨论】:

      • 感谢您的建议 - 我确实使用 Xcode 来配置文件(它运行附加到 Instruments 的应用程序)并找到了我在问题中描述的内容。我现在想知道的是如何处理我从分析中找到的信息 - 如何解决内存问题。
      猜你喜欢
      • 2012-11-06
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2013-03-24
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多