下面显示了内存的生命周期,在内存分配阶段js引擎将内存分为栈、堆、池三种结构(严格来讲池也属于栈内存,这里为了直观分开写),还有一个程序运行时须要的内存;在内存使用阶段引擎会将特定结构的数据作一些优化处理;在内存释放回收阶段经过特定的算法高效的进行内存释放。 算法
栈是一种先进后出的数据结构,栈内存用于存放变量 ,程序运行时a,b依次进入栈空间,同时调用函数会造成一个调用栈 数组
因为引用类型的值是可变的,因此存在堆中,栈中的变量存放着指向堆内存地址的指针 session
池内存用于存放基本数据类型(为固定值),栈中的变量存放着指向池内存地址的指针数据结构
当定义一个对象时,以下图所示,obj对象模型会将属性值保存起来,属性值对应的私有属性,包含具体的值、是否可写、是否可枚举、是否可配置;而数组中,obj对象模型保存的是length属性以及元素的索引,其中lenght属性是不可枚举以及不可配置,其余的保持默认。函数
ps:各个引擎实现略有差别优化
按照上面说的,每建立一个对象就会建立相对应的obj模型,是否太浪费了?shapes方法就是就是为了优化当具备相同结构 (具备相同的属性值) 的对象建立时形成的内存浪费,它为此新建了一个shape对象用于保存对象中相同的属性,属性保存着属性值在原对象中的偏移量(offset)。根据对象的结构来优化对象的属性获取 指针
当定义一个空对象,在往里面新增属性的时候。其中,每往里面新增一个属性就会产生一个shape对象,以此类推,便会造成一个Transition链,当须要访问属性的时候从下往上查找。cdn
当有多个空对象定义时,公用一个空shape对象,造成一个Transition树 对象
1.始终以相同的⽅式初始化对象,以确保它们不会走向不同的shape方向
2.避免使⽤用稀疏数组blog
1.blog.sessionstack.com
2.mathiasbynens.be/notes
3.v8.dev
溜了溜了。。。