【深入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相互引用时就翻车了。
标记清除:
系统创建一个根节点,然后垃圾回收系统会定时从跟节点去寻找引用的对象,如果无法从根节点访问到,就说明已经不存在引用关系,就可以进行删除。