JavaScript不同于其他语言,在JavaScript中的内存都是自动分配和回收。如同请人打扫卫生。其实在大多数的情况下无需理会内存机制,但是内存的理解对于深入研究一门面语言是很重要的事情。
内存模型
JS内存空间分为栈、堆、池。
基础类型与栈内存
JS中的基本类型(Number、Strign、null、undefined、Boolean)都是有固定大小的,往往都保存在栈内存中(闭包除外),由系统自动分配空间。我们可以直接操作保存在栈中内存空间。通常采用兵乓球盒子来理解栈的存储方式:
栈.PNG
像这种兵乓球盒一样,处于盒子中最顶层的兵乓球3他一定是最后放进去的,但可以被最先使用。而我们想要使用最底层的兵乓球1就必须将上面的的兵乓球取出来让兵乓球处于盒子顶层。这就是栈先进后出,后出先进的特点。
引用数据类型与堆内存
JS的引用数据类型,比如数组Array,它们值得大小是不固定的。引用数据类型的值是保存在堆内存中的。JS不直接访问堆内存的位置。因此我们不能直接操作对象的堆内存空间。在操作对象时,实际是在操作对象的引用。因此,引用类型的值都是按引用访问的。这里的引用,我们可以粗浅的理解为保存在栈内存中的一个地址。该地址与堆内存的实际值相关联。
因此我们访问引用数据类型,实际上我们首先是从栈中获取了该对象的地址引用(或指针)然后再在堆内存中取得我们需要的数据类型
内存的生命周期
JS环境中分配的内存一般有如下生命周期:
- 内存分配: 当我们申明变量、函数、对象的时候、系统会自动为它们分配内存;
- 内存使用: 即读写内存,也就是使用变量、函数;
- 内存回收: 使用完毕,由垃圾回收机制自动回收不在使用的内存;
let a = 1; // 内存分配
console.log(a); // 内存使用
a = null; // 内存回收
内存回收
JavaScript有自动垃圾收集机制,那么这个自动垃圾收集机制的原理是什么呢?其实很简单,就是找出那些不再继续使用的值,然后释放其占用的内存。垃圾收集器会每隔固定的时间段就执行一次释放操作。