乐器与iOS:为什么Memory Monitor不同意分配?

问题描述:

从仪器屏幕截图中可以看出,Allocations认为我的应用程序(Ongo)仅使用7.55 MB的内存,而Memory Monitor则使用53.30。此外,免费系统内存与应用程序正在使用的内存量几乎没有关联。有谁知道为什么这两种工具之间有这么大的分歧?此外,是否有可能找到低系统内存的来源或如何避免这么快耗尽?我的应用程序似乎没有泄漏内存,但不知何故它耗尽了系统资源。乐器与iOS:为什么Memory Monitor不同意分配?

感谢

Instruments Y U Lie?

+0

没有人知道这个的原因?我唯一的猜测是,使用屏幕的房地产图像不分配给应用程序,但在内存监视器。分配不跟踪整个进程的内存使用情况,还是内存跟踪内存不在我的进程中? – Brian 2011-04-11 15:36:47

+1

是不是内存监视器跟踪内存的所有正在运行的应用程序和分配工具只适用于您的应用程序? – 2011-04-11 15:48:19

+1

@iPortable ofc它是,这就是为什么他没有比较所有的内存使用,但只有它的应用程序...阅读好问题。 – 2011-04-11 16:02:35

对于那些谁在2012年以后看到这个帖子:

真正加载到设备的物理内存的内存是在虚拟机跟踪仪的驻留内存。

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

请观看WWDC 2012 Session 242 iOS应用程序性能:内存从Apple获取信息。

我相信这是由于这样的事实:从OpenGL ES的内存使用量从隐藏ObjectAlloc中,但在内存监视器计数。例如,在他的问题here中查看zoul的测试,他在ObjectAlloc中创建纹理时观察到轻微上升,但是当传递给OpenGL ES时,该内存从该工具中消失。内存监视器仍然追踪该纹理内存。

这应该包括UI元素的视觉方面,比如图层和视图,因为CALayers实际上是OpenGL ES纹理的包装器。 UI元素的实际2D图像表示看起来不会被ObjectAlloc跟踪,这导致ObjectAlloc中的总值更低。

ObjectAlloc仍然适用于跟踪分配的数量和类型,并且自堆积功能出现以来更具价值。你只是想与内存监视器合作,看看你真正的整体内存使用情况。

+3

感谢您的答案布拉德。 50分钟到格兰芬多。我希望得到一个更明确的答案,可能会指出我错过的一些文档,但猜测没有人会有。无论如何,祖尔的测试很有趣。 – Brian 2011-04-17 15:47:28

+0

感谢您的回答布拉德,我的应用程序是CoreData和UIWebView沉重,所以我想我应该仔细看看后者(内存监视器报告说我的应用程序正在使用〜100 MB,iPad 1,iOS 5)。 – 2012-02-09 16:13:33

内存监视器将统计应用程序占用的大部分或全部资源,包括在内核级别间接分配的资源。这包括Brad建议的AFAIK视频内存(纹理等),还包括内存映射文件和可能的大内核结构,如套接字。该名单可能是很长......

+0

Joe,内存显示器非常接近你感兴趣的数字。我们追逐了一个特定的错误很长一段时间,苹果工程师丢失了内存/没有在内存显示器中占用内存,最终导致应用程序崩溃,有时电话!但这是非常罕见的,从未解决。 – 2011-04-15 08:20:58

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