使用 iOS 的仪器:为啥内存监视器不同意分配?

Posted

技术标签:

【中文标题】使用 iOS 的仪器:为啥内存监视器不同意分配?【英文标题】:instruments with iOS: Why does Memory Monitor disagree with Allocations?使用 iOS 的仪器:为什么内存监视器不同意分配? 【发布时间】:2011-07-27 23:54:50 【问题描述】:

从仪器的屏幕截图中可以看出,Allocations 认为我的应用程序 (Ongo) 仅使用 7.55 MB 的内存,而内存监视器显示为 53.30。此外,可用系统内存与应用程序使用的内存量几乎没有相关性。有谁知道为什么这两个工具之间存在如此大的分歧?此外,是否有可能找到系统内存不足的根源,或者如何防止它这么快耗尽?我的应用似乎没有泄漏内存,但不知何故耗尽了系统资源。

谢谢

【问题讨论】:

没人知道这是什么原因?我唯一的猜测是,为图像使用屏幕空间不会在分配中向应用程序收费,而是在内存监视器中。分配不会跟踪整个进程的内存使用情况,还是内存监视器跟踪不在我的进程中的内存? 内存监视器不是跟踪所有正在运行的应用程序的内存,而分配工具不是仅为您的应用程序吗? @iPortable ofc 是的,这就是为什么他没有比较所有内存使用情况,而只是比较它的应用程序...阅读好问题。 【参考方案1】:

我相信这是因为 OpenGL ES 的内存使用对 ObjectAlloc 隐藏,但在内存监视器中计算。例如,请参阅 zoul 在他的问题here 中的测试,他在其中观察到 ObjectAlloc 在创建纹理时略有上升,但是当传递给 OpenGL ES 时,该内存从该仪器中消失了。内存监视器仍会跟踪该纹理内存。

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

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

【讨论】:

感谢布拉德的回答。格兰芬多50分。我希望有一个更明确的答案,也许指向我错过的一些文档,但猜想没有一个。无论如何,Zoul 的测试很有趣。 感谢您的回答布拉德,我的应用程序是 CoreData 和 UIWebView 重,所以我想我应该仔细看看后者(内存监视器报告我的应用程序正在使用 ~ 100 MB,iPad 1,ios 5)。【参考方案2】:

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

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

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

请观看 WWDC 2012 Session 242 iOS App Performance: Memory 从 Apple 获取信息。

【讨论】:

视频developer.apple.com/videos/play/wwdc2012/242,感兴趣的朋友可以观看。【参考方案3】:

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

【讨论】:

Joe,内存监视器与您感兴趣的数字非常接近。我们一直在与 Apple 工程师一起追查一个特定的错误,即内存丢失/未在内存监视器中计算,最终导致应用程序崩溃,有时甚至导致手机崩溃!但这非常罕见,而且从未解决。【参考方案4】:

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

【讨论】:

以上是关于使用 iOS 的仪器:为啥内存监视器不同意分配?的主要内容,如果未能解决你的问题,请参考以下文章

为啥仪器中的分配图显示没有增加而标记的代数显示内存增长

为啥反复分配和释放内存会耗尽系统所有内存?

使用仪器查找代码中的堆栈溢出

仪器报告内存泄漏。不明白为啥

使用仪器解决内存不足警告

应用程序因内存使用率非常低而崩溃 iphone/iPad