26

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

谢谢

仪器宇烈?

4

4 回答 4

31

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

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

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

于 2011-04-11T20:34:03.213 回答
5

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

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

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

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

于 2013-08-22T01:59:00.863 回答
3

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

于 2011-04-14T15:56:32.657 回答
0

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

于 2016-11-04T00:12:32.243 回答