JavaScript 内存模型

  • 1.内存的生命周期
  • 2.对象模型
  • 3.对象属性的访问优化

1.内存的生命周期

下面显示了内存的生命周期,在内存分配阶段js引擎将内存分为栈、堆、池三种结构(严格来讲池也属于栈内存,这里为了直观分开写),还有一个程序运行时须要的内存;在内存使用阶段引擎会将特定结构的数据作一些优化处理;在内存释放回收阶段经过特定的算法高效的进行内存释放。 算法

1.1栈内存

栈是一种先进后出的数据结构,栈内存用于存放变量 ,程序运行时a,b依次进入栈空间,同时调用函数会造成一个调用栈 数组

1.2堆内存

因为引用类型的值是可变的,因此存在堆中,栈中的变量存放着指向堆内存地址的指针 session

1.3池内存

池内存用于存放基本数据类型(为固定值),栈中的变量存放着指向池内存地址的指针数据结构


2.对象模型

当定义一个对象时,以下图所示,obj对象模型会将属性值保存起来,属性值对应的私有属性,包含具体的值、是否可写、是否可枚举、是否可配置;而数组中,obj对象模型保存的是length属性以及元素的索引,其中lenght属性是不可枚举以及不可配置,其余的保持默认。函数

3.对象属性的访问优化

ps:各个引擎实现略有差别优化

3.1 具备相同结构的对象-shapes方法

按照上面说的,每建立一个对象就会建立相对应的obj模型,是否太浪费了?shapes方法就是就是为了优化当具备相同结构 (具备相同的属性值) 的对象建立时形成的内存浪费,它为此新建了一个shape对象用于保存对象中相同的属性,属性保存着属性值在原对象中的偏移量(offset)。根据对象的结构来优化对象的属性获取 指针

3.2 具备不相同结构的对象 -Transition链方法

当定义一个空对象,在往里面新增属性的时候。其中,每往里面新增一个属性就会产生一个shape对象,以此类推,便会造成一个Transition链,当须要访问属性的时候从下往上查找。cdn

3.3 具备不相同结构的对象 -Transition树方法

当有多个空对象定义时,公用一个空shape对象,造成一个Transition树 对象

结论:

1.始终以相同的⽅式初始化对象,以确保它们不会走向不同的shape方向
2.避免使⽤用稀疏数组blog

参考

1.blog.sessionstack.com
2.mathiasbynens.be/notes
3.v8.dev

溜了溜了。。。

相关文章
相关标签/搜索