内存管理

V8中的内存管理

内存分为堆(heap)和栈(stack。栈内存储简单数据类型,方便快速写入和读取数据。堆内存则可以存储复杂的数据类型。在访问数据时,先从栈内寻找相应数据的存储地址,再根据获得的地址,找到堆内该变量真正存储的内容读取出来。

在前端中,被存储在栈内的数据包括小数值型,string,boolean和复杂类型的地址索引。所谓小数值数据(small number),即长度短于32位存储空间的number型数据。一些复杂的数据类型,诸如ArrayObject等,是被存在堆中的。如果我们要获取一个已存储的对象A,会先从栈中找到这个变量存储的地址,再根据该地址找到堆中相应的数据。

简单的数据类型由于存储在栈中,读取写入速度相对复杂类型(存在堆中)会更快些。下面的Demo对比了存在堆中和栈中的写入性能:

function inStack() {
  let number = 1e5;
  const a;

  while (number--) {
    a = 1;
  }
}

const obj = {};
function inHeap() {
  let number = 1e5;

  while (number--) {
    obj.key = 1;
  }
}