我在这一点上确实很困惑。
我有一个iPad应用程序,在对象分配工具中显示“Live Bytes”使用量为6-12mb。如果我拉起内存监视器或活动监视器,“真实内存”列在经过一些严重的使用后一直攀升到80-90mb左右。
我是否有正常的内存占用或高内存?
This answer和this answer声称您应该观看“Live Bytes”,因为“Real Memory”列显示已发布的内存块,但操作系统尚未回收它。
另一方面,this answer声称您需要关注该内存监视器,因为“Live Bytes”不包含界面元素等内容。
iOS内存占用的处理方式是什么?:)
答案 0 :(得分:13)
这些只是衡量内存使用的两个不同指标。哪一个是“正确的”取决于你想要回答的问题。
简而言之,“实时字节”和“实际内存”之间的差异是当前用于应用程序创建的内容的内存量与当前归因于应用程序的物理内存总量之间的差异。至少有两个不同的原因:
代码:当然,您的应用代码必须加载到内存中,虚拟内存系统肯定会将其归因于您的应用,即使它不是您的应用分配的内存。 / p>
内存池:大多数分配器通过维护一个或多个内存池来工作,他们可以从中创建单个对象或已分配内存块的片段。大多数malloc
的实现都是这样工作的,我希望对象分配器也能这样做。当取消分配对象时,这些池不会自动向下调整大小 - 内存在池中标记为“空闲”,但整个池仍将归因于您的应用程序。
可能有其他方式将内存归因于您的应用,而不是由您的代码直接分配。
那么,您想了解您的应用程序是什么?如果你想弄清楚你的应用程序因为内存不足而崩溃的原因,请查看“实时字节”(看看你的应用现在使用的是什么)和“真实内存”(看看VM系统说你的内存有多少应用正在使用)。如果您正在尝试提高应用程序的内存性能,查看“实时字节”或“活动对象”更有可能有所帮助,因为这是您可以执行某些操作的内存。
答案 1 :(得分:13)
看到我写的the last answer是如何写的,我将不得不支持。如果您想要对应用程序的当前内存使用量进行全面,准确的计数,请使用Memory Monitor仪器。
由于我在this answer中描述的原因,Allocations隐藏了某些元素的内存大小,这意味着它的内存使用总量明显低于应用程序的内存大小。当许多人试图让他们的应用程序在较旧的iOS设备上运行时,很难发现这一点。在较旧的硬件上,你有一个大约30 MB的硬内存上限,如果你超过了你的应用程序被硬杀死。
许多开发人员(包括我自己)看到我们在Allocations中只有1-2 MB的实时字节,并认为我们很好,直到我们的应用程序开始接收内存警告和提前终止。如果您查看内存监视器,您可以看到这些应用程序的真实内存大小> 20 MB,您可以看到应用程序在内存监视器中超过30 MB屏障时终止。
因此,如果要准确评估应用程序内存总量,请使用内存监视器。分配很好地找出内存中的特定对象,特别是当您使用堆镜头来查找可能正在累积的内容时(如泄漏,保留周期或其他原因)。在确定应用程序在内存中的实际大小时,请不要相信它。
答案 2 :(得分:1)
'实时字节'表示代码分配的内存(例如malloc
),因此您可以访问此内存。 “真实内存”显示应用程序使用的物理内存量。这还包括OpenGL纹理,(可能)来自Open AL的声音......
实时字节对于检查何时在代码中分配和释放内存非常有用。实内存是内存优化效率的良好指标。它的开销导致“内存不足”的警告。