什么是iOS内存占用的正确统计数据.直播字节?真实记忆?其他?

Bob*_*ryn 26 memory memory-management diagnostics ios

我在这一点上肯定很困惑.

我有一个iPad应用程序,在对象分配工具中显示"Live Bytes"使用量为6-12mb.如果我拉起内存监视器或活动监视器,"真实内存"列在经过一些严重的使用后一直攀升到80-90mb左右.

那么我是否有正常的内存占用或高内存?

这个答案这个答案声称您应该观看"Live Bytes",因为"Real Memory"列显示已发布的内存块,但操作系统尚未回收它.

另一方面,这个答案声称你需要注意那个内存监视器,因为"Live Bytes"不包括界面元素之类的东西.

什么是iOS内存占用的处理!?:)

Cal*_*leb 13

这些只是衡量内存使用的两个不同指标.哪一个是"正确的"取决于你想要回答的问题.

简而言之,"实时字节"和"实际内存"之间的差异是当前用于应用程序创建的内容的内存量与当前归因于应用程序的物理内存总量之间的差异.这些不同的原因至少有两个:

  • 代码:当然,您的应用程序代码必须加载到内存中,并且虚拟内存系统肯定会将其归因于您的应用程序,即使它不是您的应用程序分配的内存.

  • 内存池:大多数分配器通过维护一个或多个内存池来工作,它们可以从中创建单个对象或已分配内存块的片段.大多数malloc工作的实现方式,我希望对象分配器也这样做.取消分配对象时,这些池不会自动向下调整大小 - 内存在池中标记为"空闲",但整个池仍将归因于您的应用程序.

可能有其他方式将内存归因于您的应用,而不是由您的代码直接分配.

那么,您想了解您的应用程序是什么?如果你想弄清楚你的应用程序因为内存不足而崩溃的原因,请查看"实时字节"(看看你的应用现在使用的是什么)和"真实内存"(看看VM系统说你的内存有多少应用正在使用).如果您正在尝试提高应用程序的内存性能,查看"实时字节"或"活动对象"更有可能提供帮助,因为这是您可以执行某些操作的内存.


Bra*_*son 13

看到我如何写下您链接的最后一个答案,我将不得不支持.如果要全面准确计算应用程序的当前内存使用情况,请使用Memory Monitor仪器.

由于我在本回答中描述的原因,Allocations隐藏了某些元素的内存大小,这意味着它的内存使用总量显着低于应用程序的内存大小.当许多人试图让他们的应用程序在较旧的iOS设备上运行时,很难发现这一点.在较旧的硬件上,你有一个大约30 MB的硬内存上限,如果你超过了你的应用程序被硬杀死.

许多开发人员(包括我自己)看到我们在Allocations中只有1-2 MB的实时字节,并认为我们很好,直到我们的应用程序开始接收内存警告和提前终止.如果您查看内存监视器,您可以看到这些应用程序的真实内存大小> 20 MB,您可以看到应用程序在内存监视器中超过30 MB屏障时终止.

因此,如果要准确评估应用程序的总内存使用情况,请使用内存监视器.分配很好地找出内存中的特定对象,特别是当您使用堆镜头来查找可能正在累积的内容时(如泄漏,保留周期或其他原因).在确定应用程序在内存中的实际大小时,请不要相信它.