前端性能测试(二):内存占用

首先介绍下常用术语:

内存分析的常用术语,如果有java或者.Net变成经验也许你会更熟悉它们。
对象大小 Object Sizes
保留路径 
Dominators(统治者,我觉得就是父节点的意思)
一个对象A的统治者是从跟节点到A对象的每个简单路径上的对象。也就是,如果统治者对象从堆中移除,对象A到GC根节点将不可达,被抛弃。
统治者对象构成了一个树型结构,因为每个节点有确定的一个统治者。每个对象的统治者缺少直接到达其他对象的路径,也就是,统治者树不是一个生成树。
像Collection集合对象在它们支配其他对象的时候会保留大量内存。这种树节点被称为积累点。

具体细节
这部分介绍V8 JavaScript虚拟机。阅读这部分有助于堆快照的理解。

JavaScript Objects Representation
Number可以用31位整型值(被称为small integers或者SMIs),或者堆对象(被称为heap numbers)。后者用于不适合用SMI格式存储的值,比如double,或者值需要被boxed,比如为它设置属性。

String型既可以被存储在VM堆,又可以存储在浏览器内存中。从web接收内容,没有复制到VM堆中,而是创建一个被包装的对象,被用来和其他存储通信。

当2个String合在一起,它们的内容最初是分开存储的,只是逻辑上合并,通过一个称为cons string的对象实现。只在需要的时候才会合并cons string的内容,比如创建一个需要加入字符的子字符串。

Array在 V8 VM广泛使用,用于存储大量的数据。键值对通过Array备份。因此,数组是JavaScript对象的基本构建块。一个典型的JavaScript对象具有2个数组:一个用来存储属性名称,另一个存储数字元素。当属性的数量非常小的情况下,可在内部存储为JavaScript对象本身。

一个Map对象描述对象的类型和它的布局。例如地图是用来描述隐式对象的层次结构,如下所述:
对象组 Object Groups
每个本地对象组是由互相引用的对象组成。例如,一个DOM子树,每个节点都有一个父链接,链接到下一个孩子节点或者兄弟节点,从而形成一个联通图。需要注意的是本机对象不在JavaScript堆——这就是为什么他们的大小为零。相反,创建wrapper objects。每个包装对象持有响应本地对象的引用,用来重定向对这个包装对象的命令。一个租对象包含包装对象。然而,这并不会创建一个无法回收的周期,GC足够聪明到释放那些不再被组对象引用的包装对象。但忘记释放一个单一的包装对象会保留整个组和相关的包装。











你可能感兴趣的:(前端性能测试)