如何去除Objective-C中驻留的脏内存?

如何去除Objective-C中驻留的脏内存?,objective-c,xcode,ios,instruments,Objective C,Xcode,Ios,Instruments,我观看了苹果公司的WWDC 2010视频,视频内容是关于使用仪器进行高级内存分析,从中,我找到了大量驻留的脏内存。我意识到拥有如此多的内存是一件坏事(可能是我的应用程序崩溃的原因…),但我不知道如何修复它。我应该去哪里看 仪器向我展示了许多对我来说像胡言乱语的潜在有用信息,例如: % of Res Type Resident Size 18% VM_ALLOCATE (8192 pages) 32.00 MB 这属于“脏”类别-在只有2

我观看了苹果公司的WWDC 2010视频,视频内容是关于使用仪器进行高级内存分析,从中,我找到了大量驻留的脏内存。我意识到拥有如此多的内存是一件坏事(可能是我的应用程序崩溃的原因…),但我不知道如何修复它。我应该去哪里看

仪器向我展示了许多对我来说像胡言乱语的潜在有用信息,例如:

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

这属于“脏”类别-在只有256MB的设备上,32MB的驻留脏内存非常多,对吗?:)还有几个像这样的大块。如何从仪器中追溯到我的代码?或者我应该忘记工具,在我的代码中寻找特定的问题吗?

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


希望这有帮助

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

在设备或模拟器上运行时,您是否看到分配的32 MB VM_块

我这样问是因为当我在我正在开发的OSX应用程序上使用分配工具时,我还注意到一块32MB的VM_分配,我想知道这是否是在OSX环境中运行的副产品。在设备上运行可能会提供不同的数据集

不过,通常情况下,驻留内存是指应用程序正在使用的未交换到磁盘的内存。在iOS上,没有交换,所以驻留内存应该等于虚拟内存占用

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

我不确定你在应用程序中到底在做什么,但我猜你已经从捆绑包中加载了一些大型资产,并将它们保留下来。如果可能的话,不要这样做

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

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

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

“这属于“脏”类别-32 MB驻留脏内存…” “我还注意到一个32 MB的VM_分配块,我想知道…”

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

为了进行比较,我分析了保罗·赫加蒂(Paul Hegarty)在iTunes U-Stanford课程中构建的(较小的)演示应用程序——例如《心理学家》和《图形计算器》——并在每个应用程序中看到了相同的条目

我是一个“域名专家”,对内存管理的细节还没有很好的理解,所以我不能提供权威性的解释,但得出这样的结论似乎是合理的,即这种分配是由于模拟器上运行的所有应用程序所共有的框架元素。(我没有在设备上运行它们。)


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

感谢您的建议-我确实使用了Xcode进行了配置(运行附加到仪器上的应用程序),并找到了我在问题中描述的内容。我现在想知道的是如何处理从分析中找到的信息-如何解决内存问题。您的数据是来自在模拟器中运行应用程序还是来自设备?Steve-我两者都做过,但我相信上面显示的数据来自模拟器。+1。切换到
imageWithContentsofFile:
时,快速循环许多UIImages会阻止我的虚拟内存像
imageNamed:
那样加速。不再有内存不足警告!谢谢