使用iOS仪器:为什么内存监视器与分配不一致?

26
如图所示,从Instruments的截图中可以看出,Allocations工具认为我的应用程序(Ongo)只使用了7.55 MB的内存,而Memory Monitor则显示为53.30 MB。此外,系统可用内存与应用程序使用内存之间似乎没有太大的关联。有没有人知道这两个工具之间为什么存在如此大的分歧?另外,是否有可能找到低系统内存的来源或者如何避免它很快耗尽?我的应用程序似乎没有内存泄漏问题,但是却在消耗系统资源。

谢谢。

Instruments Y U Lie?


有人知道这个原因吗?我唯一的猜测是,使用屏幕空间来显示图像不会计入分配给应用程序的分配量,但会在内存监视器中计算。难道分配量没有跟踪整个进程的内存使用情况,还是内存监视器跟踪了不属于我的进程的内存? - Brian
1
内存监视器不是跟踪所有正在运行的应用程序的内存,而分配工具只针对您的应用程序吗? - user207616
1
@iPortable 当然是这样的,这就是为什么他不是在比较所有的内存使用情况,而只是比较它的应用程序...好好读一下问题。 - Vincent Guerci
4个回答

31

我认为这是因为OpenGL ES所使用的内存在ObjectAlloc中不可见,但在Memory Monitor中计算。例如,查看zoul在他的问题here中的测试,他观察到创建纹理时ObjectAlloc会稍微增加一些内存,但当传递给OpenGL ES后,该内存从该工具中消失。 Memory Monitor仍跟踪该纹理内存。

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

ObjectAlloc仍然适用于跟踪分配数量和类型,随着堆快照功能的出现,它变得更加有价值。您只需要与Memory Monitor一起使用,以查看真正的总体内存使用情况。


3
谢谢你的回答 Brad。向格兰芬多分配50个点。我希望能得到一个更明确的答案,也许是指出我错过的一些文献资料,但我想可能没有这样的答案。无论如何,Zoul的测试很有趣。 - Brian
感谢你的回答Brad,我的应用程序使用了CoreData和UIWebView,因此我认为我应该更仔细地查看后者(Memory Monitor报告显示我的应用程序正在使用约100 MB,iPad 1,iOS 5)。 - Piotr Byzia

5

对于看到这篇文章的2012年之后的读者:

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

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

请观看苹果公司的WWDC 2012 Session 242 iOS App Performance: Memory以获取更多信息。


对于那些感兴趣的人,可以前往https://developer.apple.com/videos/play/wwdc2012/242/观看视频。 - Rob

3

内存监视器将计算应用程序持有的大部分或全部资源,包括在内核级别间接分配的资源。这包括像Brad建议的视频内存(纹理等)以及内存映射文件和可能是较大的内核结构,如套接字。列表可能相当长...


乔,内存监视器非常接近你感兴趣的数字。我们和苹果工程师追踪了一个特定的错误很长时间,其中内存丢失/未被内存监视器记录,最终导致应用程序崩溃,有时甚至导致手机崩溃!但这种情况极为罕见,从未解决。 - Steven Kramer

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接