JavaScript 内存模型

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

1.内存的生命周期

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

1.1栈内存

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

1.2堆内存

由于引用类型的值是可变的,所以存在堆中,栈中的变量存放着指向堆内存地址的指针

1.3池内存

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


2.对象模型

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

3.对象属性的访问优化

ps:各个引擎实现略有差异

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

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

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

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

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

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

结论:

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

参考

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

溜了溜了。。。