iOS的乐器:为什么Memory Monitor不同意Allocations?

时间:2011-04-01 21:11:58

标签: iphone ios ipad memory-management xcode-instruments

从这个从乐器拍摄的屏幕中可以看出,Allocations认为我的应用程序(Ongo)仅使用7.55 MB的内存,而Memory Monitor则说53.30。此外,自由系统内存与应用程序使用的内存量几乎没有任何关联。有谁知道为什么这两个工具之间存在如此大的分歧?另外,是否可以找到低系统内存的来源或如何防止它快速耗尽?我的应用程序似乎没有泄漏内存,但不知何故,它耗尽了系统资源。

由于

Instruments Y U Lie?

4 个答案:

答案 0 :(得分:30)

我认为这是因为OpenGL ES的内存使用从ObjectAlloc隐藏,但在Memory Monitor中计算。例如,在他的问题here中查看zoul的测试,他在创建纹理时观察到ObjectAlloc略微上升,但是当传递给OpenGL ES时,该内存从该工具中消失。内存监视器仍然跟踪纹理内存。

这应包括UI元素的视觉方面,如图层和视图,因为CALayers实际上是OpenGL ES纹理的包装器。 ObjectAlloc似乎没有跟踪UI元素的实际2D图像表示,这导致ObjectAlloc中的总值较低。

ObjectAlloc仍然适用于跟踪数量和分配类型,并且自快照功能出现以来更有价值。您只想与Memory Monitor合作,查看您的真实整体内存使用情况。

答案 1 :(得分:4)

对于那些在2012年之后看到这篇文章的人:

真正加载到设备物理内存中的内存是VM Tracker Instrument中的Resident Memory。

分配工具仅标记由malloc / [NSObject alloc]和一些框架缓冲区创建的内存,例如,解压缩的图像位图不包含在分配工具中,但它总是占用大部分内存。

请观看WWDC 2012会话242 iOS应用程序性能:内存以获取Apple的信息。

答案 2 :(得分:3)

内存监视器将计算应用程序持有的大部分或全部资源,包括内核级别的间接分配资源。这包括Brad建议的AFAIK视频内存(纹理等),但也包括内存映射文件和可能较大的内核结构,如套接字。这份清单可能很长......

答案 3 :(得分:0)

封装在对GCD的调度调用的大括号内的任何代码都屏蔽了两件事:错误报告,有时还有分配计数。这通常只适用于CoreFoundation或任何其他非UIKit或非NSFoundation。