JS的内存管理

59 阅读2分钟

什么是内存管理

不管使用什么样的编程语言,在代码的执行过程中,都需要给它分配内存。有些语言会让我们手动管理,有些会自动帮助我们管理内存。

内存管理的生命周期

  1. 分配申请你需要的内存(申请)
  2. 使用分配的内存
  3. 不需要使用时,对其进行释放 (防止栈用尽等问题)

不同编程语言一、三步的不同实现

手动管理:比如C,C++ 需要手动给管理(maloc和free函数)

自动管理:比如Java,JS,Python会自动帮助我们管理

JS的内存管理

一般而言JS在定义变量时就帮助我们自动分配内存了。JS的基本数据类型会在执行时,分配在栈里面。

复杂的数据类型(对象等)会被存放在堆空间里。这个变量有一个引用(形如0x100这种十六进制的地址)指向内存堆里的位置。 这个引用我们也叫它指针。

image.png

JS的垃圾回收

对于那些不再使用的对象,我们称之为是垃圾,需要被回收,以释放更多的内存空间。 垃圾回收器我们简称为GC。

GC常用的算法

引用计数算法

某一对象设置一个存储计数器,只要有一个引用指向它,计数器就+1。如果计数器变为0的话内存就回收该对象。

但是引用计数算法存在一个问题, 循环引用

就像一个双向链表一样,双方指针互相指向。

image.png

解决方法是给某一对象指针(引用)设为Null

标记清楚算法

该算法是设置一个根对象(root object),垃圾回收器会定期从这个根开始,找到从根开始有引用到的对象,对于那些没有引用到的对象,就认为是不可用的对象。他可以很好的解决事件循环的问题。

image.png

如图 M N 就不可达

V8引擎采用的就是标记清楚,但是为了更好的优化,在这个算法上又增加了一些新的算法