什么是iOS内存足迹的正确统计数据。 现场字节? 真正的记忆? 其他?

我对此很困惑。

我有一个iPad应用程序,在对象分配工具中显示6-12mb的“实时字节”使用情况。 如果我拔出内存监视器或活动监视器,“真实内存”列将在一些严重的使用情况下持续攀升至80-90mb左右。

那么我有一个正常的内存足迹还是一个高的?

这个答案和这个答案声称你应该看'实时字节'作为'真正的内存'列显示内存块已被释放,但操作系统还没有回收它。

另一方面, 这个答案声称你需要关注那个内存监视器,因为“实时字节”不包括像界面元素这样的东西。

iOS内存占用情况如何? 🙂

这些只是测量内存使用情况的两个不同指标。 哪一个是“正确的”取决于你想要回答的问题。

简而言之,“实时字节数”和“实际内存量”之间的区别在于您的应用程序创build的内容当前使用的内存量与当前归因于您的应用程序的物理内存总量之间的差异。 至less有两个原因是不同的:

  • 代码:当然,你的应用程序的代码必须被加载到内存中,而虚拟内存系统肯定会将它归入你的应用程序,尽pipe这不是你的应用程序分配的内存。

  • 内存池:大多数分配器的工作方式是维护一个或多个内存池,从中可以分割出单个对象或分配的内存块。 malloc大部分实现都是这样工作的,而且我也希望对象分配器也能这样做。 当对象被释放时,这些池不会自动向下resize – 内存在池中被标记为“空闲”,但是整个池仍然会被归因于您的应用程序。

内存可能还有其他方式归因于您的应用程序,而不会被您的代码直接分配。

那么,你想了解你的应用程序? 如果你想知道为什么你的应用程序由于内存不足而崩溃,请查看“活动字节”(查看您的应用程序现在使用的内容)和“真实内存”(查看虚拟机系统说多less内存应用程序正在使用)。 如果您试图提高应用程序的内存性能,查看“活动字节”或“活动对象”更有可能提供帮助,因为这是您可以做的一些事情。

看到我如何写下你所链接的最后一个答案 ,我将不得不支持这一点。 如果您想要为您的应用程序准确计数当前的内存使用量,请使用内存监视器工具。

由于我在这个答案中描述的原因,Allocations隐藏了某些元素的内存大小,这意味着它的内存使用总数远远低于应用程序的内存大小。 许多人在尝试在老式的iOS设备上使用它们的应用程序时,发现了这个难题。 在较旧的硬件上,硬盘的内存限制大约为30 MB,如果超过这个限制,那么您的应用程序就会被强行杀死。

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

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

“活字节”是指你的代码(例如malloc )分配的malloc ,所以你可以访问这个内存。 “真实内存”显示您的应用使用的物理内存量。 这也包括OpenGL纹理,(可能)从打开AL声音…

实时字节对于在代码中分配和释放内存时非常有用。 真实内存是内存优化效率的良好指标。 这是开销导致“低内存”的警告。