垃圾回收机制
About 2 min
1. 什么是垃圾回收机制
垃圾回收机制(Garbage Collection)简称 GC
JavaScript 中内存的分配和回收都是自动完成的,内存在不使用的时候会被垃圾回收器自动回收,如果不再用到的内存没有及时释放,则会产生内存泄漏
2. 内存的生命周期
JavaScript 环境中分配的内存,一般有如下生命周期:
- 内存分配:当我们声明变量、函数、对象的时候,系统会自动为它们分配内存
- 内存使用:即读写内存,也就是使用变量、函数等
- 内存回收:使用完毕,由垃圾回收器自动回收不再使用的内存
说明:
- 全局变量一般不会回收(关闭页面回收)
- 一般情况下局部变量的值不用了,会被自动回收掉
3. 垃圾回收算法
3.1 引用计数
定义“内存不再使用”,就是看一个对象是否有指向它的引用,没有引用了就回收对象
算法:
- 跟踪记录被引用的次数
- 如果被引用了一次,那么就记录次数 1,多次引用会累加
- 如果减少一个引用就减一
- 如果引用次数是 0,则释放内存
存在问题: 嵌套引用(循环引用),如果两个对象相互引用,尽管他们已不再使用,垃圾回收器不会进行回收,导致内存泄漏
3.2 标记清除法
现代浏览器大多使用该方法
算法:标记清除法将“不再使用的对象”定义为“无法到达的对象”,就是从根部出发定时扫描内存中的对象。凡是能从根部到达的对象,都是还需要使用的,那些无法由根部出发触及到的对象被标记为不再使用,稍后进行回收