我正在开发一个浏览器应用程序,在该应用程序中我使用 UIWebView 打开网页。我使用内存监视器运行 Instruments 工具。我对 Instruments 中使用的术语以及它们为何重要感到完全困惑。请用适当的理由解释我的一些问题:
Live Bytes 对于检查内存优化或内存消耗很重要吗?为什么 ?
如果它还包含已释放的对象,我为什么要关心整体字节/实际内存?
何时以及为何使用这些术语(实时字节/总字节/实际内存)?
谢谢
我正在开发一个浏览器应用程序,在该应用程序中我使用 UIWebView 打开网页。我使用内存监视器运行 Instruments 工具。我对 Instruments 中使用的术语以及它们为何重要感到完全困惑。请用适当的理由解释我的一些问题:
Live Bytes 对于检查内存优化或内存消耗很重要吗?为什么 ?
如果它还包含已释放的对象,我为什么要关心整体字节/实际内存?
何时以及为何使用这些术语(实时字节/总字节/实际内存)?
谢谢
“ Live Bytes ”表示“已分配但尚未释放的内存”。这很重要,因为它是衡量“您的应用程序正在使用多少内存”的最容易掌握的衡量标准。
“总字节数”表示“所有已分配的内存,包括已释放的内存”。这不太有用,但可以让您了解“堆搅动”。流失会导致碎片化,而堆碎片化可能是一个问题(尽管如今这个问题相当模糊。)
“ Real Memory ”试图区分正在使用的物理 RAM 的数量(与有效的地址空间字节数相反)。这与“Live Bytes”不同,因为“Live Bytes”可能包括与当前未分页到物理 RAM 中的内存映射文件(或共享内存、窗口后备存储或其他)相对应的内存范围。即使您不使用内存映射文件或其他奇异的 VM 分配方法,系统框架也会这样做,并且您会使用它们,因此这种区别对每个进程总是有一定的重要性。
编辑:由于您显然担心使用 UIWebView 会导致内存使用,让我看看我是否可以对此有所了解:
使用 UIWebView 有一定的内存“代价”(即全局缓存等)。其中包括各种全局字体缓存、JavaScript JIT 缓存以及类似的东西。其中大多数将表现得像单例:在您第一次使用它们时分配(间接通过使用 UIWebView)并且在进程结束之前永远不会被释放。还有一些可变大小的全局缓存(比如那些缓存 Web 响应的缓存;CFURL 通常管理这些缓存),但这些缓存应该由系统管理。正如您所见,这些东西相对于 UIWebView 的总“权重”是非常重要的。
我对 UIKit 或 WebKit 内部结构一无所知,但我希望如果您与做过的人讨论过,他们会回答“为什么我使用 UIWebView 会导致这么多内存使用?”的问题。有两个方面:第一个方面是“这是使用 UIWebView 的入场费——它基本上就像在你的进程中运行整个网络浏览器。” 第二个方面是“系统框架缓存由系统自动管理”,这意味着例如,CFURL 缓存(这是使用 UIWebView 导致创建的东西之一)由系统管理,因此,如果出现内存警告,系统框架将负责从这些缓存中驱逐事物以减少它们消耗的内存;你无法控制那些,你只需要相信系统框架会做需要做的事情。(如果系统缓存管理器所做的任何事情对您来说都不够积极,但您不会对它们进行更多控制,这对您没有帮助,因此您需要从另一个角度解决问题,无论哪种方式。)如果您想知道为什么释放 UIWebView 后内存使用不会下降,这就是您的答案。它在幕后做了很多事情,你无法控制。无论哪种方式。)如果您想知道为什么释放 UIWebView 后内存使用不会下降,这就是您的答案。它在幕后做了很多事情,你无法控制。无论哪种方式。)如果您想知道为什么释放 UIWebView 后内存使用不会下降,这就是您的答案。它在幕后做了很多事情,你无法控制。
分配、使用和释放 UIWebView 是净零操作的期望忽略了一些重要的、固有的和不可避免的副作用。这种副作用的存在(本身)并不表示 UIWebView 中存在错误。到处都有这样的副作用。如果您要创建一个简单的应用程序,该应用程序除了启动之外什么都不做,然后在运行循环一次旋转后终止,并且您在 上设置断点exit()
,并查看已分配但从未释放的内存,将会有数千个分配. 这是在整个系统框架和几乎每个应用程序中使用的非常常见的模式。
这对你意味着什么?这意味着您实际上有两个选择:使用 UIWebView 并在内存消耗中支付“入场费”,或者不使用 UIWebView。