【深入JavaScript】Js的内存管理与常见GC回收算法


引言:

不管什么样的编程语言,在代码的执行过程中都是需要给它分配内存的,不同的是某些编程语言需要我们自己手动的管理内存,某些编程语言会可以自动帮助我们管理内存。

内存管理的基本生命周期:

  • 分配申请你需要的内存
  • 使用分配的内存(申请)
  • 不需要使用时,将其释放


一些自带GC的编程语言有:Java JavaScript PHP Go 

C++ C 是需要自己手动管理内存,对程序员要求会稍微高一点。


JS内存结构:


Js会将简单数据类型[基础数据类型]放入栈结构,如单纯的文本型变量,数值型等....

Js会将复杂数据类型放入堆结构,比如函数, 数组等......然后将其地址进行引用。


为什么需要GC【垃圾回收】


我们的计算机内存不是无限的,比如小雨的电脑运行内存是16G,那么Js能占用全部的运行内存吗?答案是不能的。内存还会受到操作系统的调度,js的运行我们可以看成只是操作系统下的一个进程罢了。所以它理所当然的不能占用到全部的内存。比如当我们的js运行在Chrome下,那Chrome的内存占用会受到操作系统的制约,而js的内存占用会受到Chrome的制约。

所以将一些使用不到的内存[js中使用不到的对象]删除释放就成了GC


常见的GC算法有 : 引用计数,标记清除(go1.3前也是这个哦但肯定有别的优化)


引用计数:

这个很好理解就是字面意思,一个资源被引用的次数,如果为0,那么这个资源就会被标为废弃资源。那么就可以被回收。

但这个方法有一个缺陷,就是循环引用问题当资源A和资源B相互引用时就翻车了。


标记清除:

系统创建一个根节点,然后垃圾回收系统会定时从跟节点去寻找引用的对象,如果无法从根节点访问到,就说明已经不存在引用关系,就可以进行删除。