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

Tom*_*yer 6 xcode objective-c instruments uiwebview ios

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

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

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

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

谢谢

ipm*_*mcc 12

" 实时字节 "表示"已分配但尚未解除分配的内存".这很重要,因为它是"应用程序使用多少内存"的最容易掌握的衡量标准.

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

" 真实内存 "试图区分使用的物理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.