Xcode仪器:内存条款实时字节和整体字节(实际内存)混淆

我正在使用一个UIWebView打开网页的浏览器应用程序。 我使用Memory Monitor运行仪器工具。 我对“乐器”中使用的术语以及它们为什么重要这些术语感到困惑。 请正确地解释我的一些问题:

  1. 实时字节对于检查内存优化或内存消耗非常重要。 为什么?

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

  3. 何时以及为什么使用这些术语(实时字节/总体字节/实际存储器)?

谢谢

实时字节 ”是指“已经分配但尚未释放的内存”。 这很重要,因为这是“您的应用程序使用了多less内存”的最易于理解的衡量标准。

总体字节 ”是指“已分配的所有内存,包括已被释放的内存”。 这是没有用的,但是给你一些“堆搅动”的想法。 客户stream失导致碎片化,堆碎片化可能成为一个问题(尽pipe这些日子是相当模糊的)。

实际内存 ”试图区分使用多less物理内存(而不是有多less字节的地址空间是有效的)。 这与“实时字节”不同,因为“实时字节”可能包括与当前未分页到物理RAM中的内存映射文件(或共享内存或窗口后备存储或其他)对应的内存范围。 即使你不使用内存映射文件或者其他exception的虚拟机分配方法,系统框架也会这样做,并且你使用它们,所以这个区别总是对每个进程都有一定的重要性。

编辑:由于您明确担心使用UIWebView引起的内存使用,让我看看我是否可以阐明一点:

有一定的内存“价格”使用UIWebView在所有(即全球caching等)。 这些包括各种全球字体caching,JavaScript JITcaching等等。 大多数这些行为将像单身人士:第一次使用它们(间接通过使用UIWebView)分配,并不会释放,直到过程结束。 还有一些可变大小的全局caching(如cachingWeb响应的caching; CFURL通常pipe理这些caching),但是这些caching有望由系统pipe理。 正如你所看到的,这些与UIWebView相关的集体“权重”是非平凡的。

我对UIKit或WebKit内部没有任何的了解,但是我期望如果你和某人做过讨论,他们会回答“为什么我使用UIWebView导致内存使用太多”的问题? 会是两个方面:第一个方面是“这是使用UIWebView的准入价格 – 基本上就像在你的stream程中运行整个networking浏览器”。 第二个方面是“系统框架caching由系统自动pipe理”,这意味着,例如CFURLcaching(这是使用UIWebView导致创build的东西之一)由系统pipe理,所以如果出现内存警告,系统框架将负责从这些caching驱逐事物,以减less它们所消耗的内存。 你无法控制这些,你只需要相信系统框架将会做什么需要做的事情。 (对于系统cachingpipe理员所做的任何事情对您来说都不够积极,但是您无法再对它们进行更多的控制的情况下,这并不能帮到您,所以您需要从另一个angular度来解决问题, )如果你想知道为什么一旦你释放你的UIWebView内存使用不下来,这是你的答案。 在幕后有一大堆东西,你无法控制。

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

这对你意味着什么? 这意味着你有两个select:使用UIWebView并在内存消耗中支付“允许的价格”,或者不使用UIWebView。