Xcode仪器:内存术语实时字节和总字节数(真实内存)混淆

时间:2013-08-29 11:52:47

标签: ios objective-c xcode uiwebview instruments

我正在开发一个浏览器应用程序,我在其中使用UIWebView打开网页。我使用Memory Monitor运行Instruments工具。我对仪器中使用的术语以及为什么它们非常重要感到困惑。请以正当理由解释我的一些问题:

  1. Live Bytes对于检查内存优化或内存消耗很重要?为什么?

  2. 为什么我会关心整体字节/实内存,如果它还包含已发布的对象?

  3. 何时以及为何使用这些术语(实时字节数/总字节数/实内存量)?

  4. 由于

1 个答案:

答案 0 :(得分:11)

Live Bytes ”表示“已分配但尚未取消分配的内存”。这很重要,因为它是“应用程序使用了多少内存”的最容易掌握的衡量标准。

总字节数”表示“所有已分配的内存,包括已释放的内存”。这不太有用,但可以让你对“堆乱”有所了解。流失会导致碎片化,堆碎片可能会成为一个问题(尽管这些日子看起来非常模糊。)

真实内存”试图区分正在使用的物理RAM数量(而不是有多少字节的地址空间有效)。这与“Live Bytes”不同,因为“Live Bytes”可能包括与当前未被分页到物理RAM中的内存映射文件(或共享内存或窗口后备存储或其他)相对应的内存范围。即使您不使用内存映射文件或其他奇特的VM分配方法,系统框架也会这样做,并且您使用它们,因此这种区别对每个进程始终具有一定的重要性。

编辑:由于您显然担心使用UIWebView会导致内存使用,让我看看是否可以了解一下:

使用UIWebView(即全局缓存等)存在一定的内存“价格”。这些包括各种全局字体缓存,JavaScript JIT缓存以及类似的东西。其中大多数都会表现得像单身:第一次使用它们时(通过使用UIWebView间接分配),并且在进程结束之前永远不会释放。还有一些可变大小的全局缓存(如缓存Web响应的缓存; CFURL通常管理这些缓存),但预计这些缓存将由系统管理。正如您所见,关于UIWebView的这些事物的集体“重量”是非平凡的。

我对UIKit或WebKit内部没有任何了解,但我希望如果你与某人做过讨论,他们对“为什么我使用UIWebView导致如此多的内存使用? “将是双管齐下:第一个将是“这是使用UIWebView的入场价格 - 它基本上就像在你的过程中运行整个网络浏览器。”第二个分支是“系统框架缓存由系统自动管理”,这意味着,例如,CFURL缓存(这是使用UIWebView导致创建的东西之一)由系统管理,因此,如果出现内存警告,系统框架将负责从这些缓存中驱逐事物以减少它们消耗的内存;你无法控制那些,你只需要相信系统框架将会做你需要做的事情。 (在系统缓存管理器执行的操作不够激进的情况下,这对您没有帮助,但是您不会再对它们进行任何控制,因此您需要从另一个角度攻击该问题,无论哪种方式。)如果您想知道为什么在取消分配UIWebView后内存使用不会失效,这就是您的答案。它背后有很多东西,你无法控制。

分配,使用然后解除分配UIWebView的期望是一个净零操作,忽略了一些非平凡的,固有的和不可避免的副作用。这种副作用的存在不是(本身)指示UIWebView中的错误。到处都有像这样的副作用。如果您要创建一个简单的应用程序,除了启动之外什么都不做,然后在一次旋转运行循环后终止,并在exit()上设置断点,并查看已分配但从未释放的内存,那么将是成千上万的分配。这是在整个系统框架和几乎每个应用程序中使用的非常常见的模式。

这对你意味着什么?这意味着你有效地有两个选择:使用UIWebView并在内存消耗中支付“入场费”,或者不使用UIWebView。