首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Objective-C中清除常驻的脏内存?

如何在Objective-C中清除常驻的脏内存?
EN

Stack Overflow用户
提问于 2011-03-25 17:37:20
回答 4查看 10.4K关注 0票数 23

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

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

代码语言:javascript
复制
% of Res  Type                      Resident Size
18%       VM_ALLOCATE (8192 pages)  32.00 MB

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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后释放原始字节。如果由于内存压力而卸载了图像视图,您不希望再次访问网络加载数据,但也不希望加载两个副本(一个NSDataUIImage)。

票数 29
EN

Stack Overflow用户

发布于 2011-03-26 06:22:30

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

希望这能有所帮助

票数 2
EN

Stack Overflow用户

发布于 2011-04-01 19:09:27

在instruments (仪器)中,单击enable snapshots automatically (启用快照)自动将视图模式更改为regions map。在文件的路径名中查找,当你的应用程序驻留在vmpages中时,以及当你清除它时,你正在使用这些文件。在视频wwdc示例中,他们对文件使用加密,这是将其推送到vmpages,而没有太难的u代码来建议库刷新:-)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5430718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档