垃圾回收问题
Youky ... 2021-10-8 About 1 min
# 垃圾回收问题
# 什么是内存泄漏
不再使用的内存没有及时释放
# 哪些情况会引起内存泄漏
无法在通过js代码引用某个对象,但垃圾回收机制却认为这个对象还在被引用,因此不会释放
- 意外的声明全局变量:
a = 10;
1
- 函数内意外使用this
function fn(){
this.foo = 'foo';
}
fn();
console.log(foo); // foo声明为了全局变量
1
2
3
4
5
2
3
4
5
- 定时器/闭包:引用了外部变量时,只要闭包返回的函数存在,该变量就不会被清理
function(){
var age = 21;
return function(){
console.log(age);
}
}
1
2
3
4
5
6
2
3
4
5
6
- 保留了对DOM的引用,在DOM节点删除后没有释放
# 垃圾回收会对哪些内容进行回收
只针对堆内存里的变量,执行栈中的变量在执行结束后直接就丢弃了。
# 垃圾回收机制的两种策略
# 引用计数
用一张“引用表”存储所有资源的引用次数。当一个资源的引用次数为0时,将对其进行回收。
缺点:无法解决循环引用问题
# 标记清除
最常用的垃圾回收方式 过程:
- 首先,给内存中存储的所有变量做上标记
- 去掉在当前上下文中的变量,以及被这些变量引用的变量
- 回收仍然带有标记的变量
# 管理内存的好习惯
- 只存储必要的数据,当变量不再需要时,将其赋值为null(结束引用)
- 使用const和let。因为二者以块为作用域,可以更早的进行垃圾回收
- 使用WeakMap和WeakSet