我观看了苹果公司的WWDC 2010关于使用仪器进行高级内存分析的视频,从中我发现了很多常驻的脏内存。我意识到,拥有如此多的常驻脏内存是一件坏事(可能也是我的应用程序崩溃如此之多的原因…),但我不确定如何修复它。我应该去哪里找呢?
Instruments向我展示了许多潜在有用的信息,这些信息对我来说像是胡言乱语,例如:
% of Res Type Resident Size
18% VM_ALLOCATE (8192 pages) 32.00 MB这属于“脏”类别-32MB的常驻脏内存在只有256MB的设备上是很大的,对吧?:)还有更多像这样的大块。如何从Instruments回溯到我的代码?或者我应该忘记Instruments,在我的代码中寻找特定的问题?
发布于 2011-04-04 02:52:42
在设备上运行或在模拟器中运行时,您是否看到这块32 MB的VM_ALLOCATE?
我之所以问这个问题,是因为当我在我正在开发的OS X应用程序上使用分配工具时,我也注意到了一块32MB的VM_ALLOCATE,我想知道这是否是在OS X环境中运行的副产品。在设备上运行可能会为您提供不同的数据集。
不过,一般来说,驻留内存是您的应用程序正在使用的未交换到磁盘的内存。在iOS上,没有交换,因此驻留内存应该等于虚拟内存占用。
脏内存是您分配和使用的内存。脏内存应该小于常驻内存,因为后者包含代码(您的和框架)。
我不确定您的应用程序到底在做什么,但我猜您已经从捆绑包中加载了一些大型资产,并将它们保留在周围。如果可能的话,不要这么做。
还有一些API可以在加载NSData对象时使用,这些API使用内存映射技术,而不是暴力读取字节。这可能会更好,因为它允许操作系统懒惰地从磁盘读取页面。使用NSData (因为它是不可变的),它可能也足够聪明,可以将页面标记为只读。从理论上讲,这对操作系统是一个有价值的提示,它可以在压力下清除这些页面,因为它知道它们不能更改。阅读+[NSData dataWithContentsOfMappedFile:]的文档。
对于图片,我记得我读过一些东西,建议你避免使用imageNamed:,除非你经常通过你的应用程序使用图片(即UI元素)。特别是对于大图像,它们可能会保留在您无法控制的缓存中。(imageNamed:在2.x版本中有一个漏洞,但它在3.x版本中得到了修复,现在使用它是完全安全的。)对于较大的图像和不是UI中重复出现的图像,请使用imageWithContentsOfFile:。
如果要从网络加载图像,请将它们缓存到磁盘上,并在创建UIImage后释放原始字节。如果由于内存压力而卸载了图像视图,您不希望再次访问网络加载数据,但也不希望加载两个副本(一个NSData和UIImage)。
发布于 2011-03-26 06:22:30
对于新的xCode 4,来自xCode 3的工具仍然存在,具有更好的用户界面来分析您的应用程序,包括泄漏和内存使用情况。我建议您查看这些工具并逐个运行,看看它们为您提供了什么。您可以在主菜单产品和-> Profile上访问xCode 4中的这些工具
希望这能有所帮助
发布于 2011-04-01 19:09:27
在instruments (仪器)中,单击enable snapshots automatically (启用快照)自动将视图模式更改为regions map。在文件的路径名中查找,当你的应用程序驻留在vmpages中时,以及当你清除它时,你正在使用这些文件。在视频wwdc示例中,他们对文件使用加密,这是将其推送到vmpages,而没有太难的u代码来建议库刷新:-)
https://stackoverflow.com/questions/5430718
复制相似问题