iOS 内存占用的正确统计数据是啥。实时字节?真实记忆?其他?
Posted
技术标签:
【中文标题】iOS 内存占用的正确统计数据是啥。实时字节?真实记忆?其他?【英文标题】:What's the right statistic for iOS Memory footprint. Live Bytes? Real Memory? Other?iOS 内存占用的正确统计数据是什么。实时字节?真实记忆?其他? 【发布时间】:2012-03-28 11:31:39 【问题描述】:我在这一点上肯定很困惑。
我有一个 iPad 应用程序,它在对象分配工具中显示 6-12mb 的“实时字节”使用量。如果我拉起内存监视器或活动监视器,“真实内存”列在经过一些严重使用后会持续攀升至 80-90mb 左右。
那么我的内存占用是正常的还是高的?
This answer 和 this answer 声称您应该观看“Live Bytes”,因为“Real Memory”列显示已释放的内存块,但操作系统尚未回收它。
另一方面,this answer 声称您需要注意那个内存监视器,因为“Live Bytes”不包括界面元素之类的东西。
iOS 内存占用有什么问题!? :)
【问题讨论】:
【参考方案1】:这只是衡量内存使用的两个不同指标。哪一个是“正确的”取决于您要回答的问题。
简而言之,“实时字节”和“实际内存”之间的差异是当前用于您的应用创建的内容的内存量与当前归属于您的应用的物理内存总量之间的差异。至少有两个不同的原因:
代码:当然,您的应用程序代码必须加载到内存中,并且虚拟内存系统肯定会将其归因于您的应用程序,即使它不是您的应用程序分配的内存。
内存池:大多数分配器通过维护一个或多个内存池来工作,它们可以从中分割出各个对象或分配的内存块。 malloc
的大多数实现都是这样工作的,我希望对象分配器也能做到。当对象被释放时,这些池不会自动向下调整大小 - 池中的内存只是标记为“空闲”,但整个池仍将归属于您的应用。
可能还有其他方式将内存分配给您的应用程序,而无需由您的代码直接分配。
那么,您想了解有关您的应用程序的哪些内容?如果您想弄清楚为什么您的应用程序由于内存不足而崩溃,请查看“实时字节”(查看您的应用程序现在正在使用什么)和“真实内存”(查看 VM 系统显示的内存量)应用程序正在使用)。如果您想提高应用的内存性能,查看“活动字节”或“活动对象”可能会有所帮助,因为这是您可以做些什么的内存。
【讨论】:
嗯,我想首先我想确定这是否是对这些指标的准确描述。我不相信它是(无意冒犯。)分配工具中还有“总字节数”列,随着时间的推移不断增加——这是有道理的,因为它会跟踪分配的完整历史。但它与“真实记忆”数字相差很大。此外,“真实内存”数字不会永远增加,但似乎比“实时字节”要高得多。首先,我想了解什么是什么。 @BobSpryn 我重写了我的答案——希望它对你和未来的读者更有用。 似乎是一个足够合理的解释。感谢您提供详细信息!【参考方案2】:'Live bytes' 表示由您的代码分配的内存(例如由malloc
),因此您可以访问此内存。 “真实内存”显示您的应用使用的物理内存量。这还包括 OpenGL 纹理,(可能)来自 Open AL 的声音...
实时字节有助于检查您何时在代码中分配和释放内存。真实内存是内存优化效率的良好指标。它的开销会导致“内存不足”警告。
【讨论】:
【参考方案3】:鉴于我是如何写 the last answer 你链接到的,我将不得不坚持这一点。如果您想对应用程序的当前内存使用情况进行总、准确的计数,请使用内存监视器工具。
由于我在this answer 中描述的原因,Allocations 隐藏了某些元素的内存大小,这意味着它的内存使用总量明显低于应用程序的内存大小。许多人在尝试让他们的应用程序在较旧的 ios 设备上正常运行时发现了这一点。在较旧的硬件上,您的硬内存上限约为 30 MB,如果超过该上限,您的应用程序就会被硬杀死。
许多开发人员(包括我自己)看到我们在分配中只有大约 1-2 MB 的活动字节,并认为我们做得很好,直到我们的应用程序开始收到内存警告和提前终止。如果您查看内存监视器,您会看到这些应用程序的真实内存大小大于 20 MB,并且您可以看到这些应用程序在它们超过内存监视器中的 30 MB 障碍的那一刻被终止。
因此,如果您想准确评估应用程序的总内存使用情况,请使用内存监视器。分配对于找出内存中的特定对象非常有用,尤其是当您使用堆镜头来查找可能正在累积的东西时(如泄漏、保留周期或其他原因)。只是在确定应用程序在内存中的实际大小时不要相信它。
【讨论】:
以上是关于iOS 内存占用的正确统计数据是啥。实时字节?真实记忆?其他?的主要内容,如果未能解决你的问题,请参考以下文章