什么是内存管理
所谓内存管理,是 js 从创建变量到垃圾回收的一个过程。
它的生命周期
- 分配你所需要的内存(变量声明的时候)
- 使用分配的内存(读,写)
- 不需要的时候回收(或者释放)内存
js 的内存空间
分三种:
- 栈:存放变量,包括基础数据类型的变量及对象的指针
- 堆:存放引用数据类型的值
- 池:一般也归类为栈,保存常量
垃圾回收的原理
找出那些不再继续使用的变量,然后释放其占用的内存。
浏览器的垃圾回收策略
- 标记清除:当变量进入引用坏境时标记为“进入环境”,离开引用环境时标记为“离开环境”,垃圾回收器运行时把标记为“离开环境”的变量回收掉,完成内存清除的工作。标记的方式有很多种(浏览器内部会做的),比如翻转某个特殊位,再或者使用一个“进入环境”的变量列表和“离开环境”的变量列表来记录。从2012年起,所有现代浏览器都使用了标记-清除垃圾回收算法。
- 引用计数算法:简单说就是,有引用时 +1,没有引用 -1,引用计数为 0 时回收。那么就有了循环引用的对象不能被回收的情况,因为它的引用计数永远不能为 0,除非手动把引用置为
null
。
什么是内存泄漏
不再用到的内存,没有及时释放,就叫做内存泄漏(memory leak)
js 中哪些操作会引发内存泄漏:
- 闭包
- 用完的定时器没有清除
- 死循环(例如没有结束条件的递归,循环引用的对象)
- 意外的全局变量(例如没有使用
var
,let
,const
定义的变量) - 被移除的DOM节点上的绑定事件没有清除