垃圾回收问题

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
  • 定时器/闭包:引用了外部变量时,只要闭包返回的函数存在,该变量就不会被清理
function(){
    var age = 21;
    return function(){
        console.log(age);
    }
}
1
2
3
4
5
6
  • 保留了对DOM的引用,在DOM节点删除后没有释放

# 垃圾回收会对哪些内容进行回收

只针对堆内存里的变量,执行栈中的变量在执行结束后直接就丢弃了。

# 垃圾回收机制的两种策略

# 引用计数

用一张“引用表”存储所有资源的引用次数。当一个资源的引用次数为0时,将对其进行回收。

缺点:无法解决循环引用问题

# 标记清除

最常用的垃圾回收方式 过程:

  1. 首先,给内存中存储的所有变量做上标记
  2. 去掉在当前上下文中的变量,以及被这些变量引用的变量
  3. 回收仍然带有标记的变量

# 管理内存的好习惯

  1. 只存储必要的数据,当变量不再需要时,将其赋值为null(结束引用)
  2. 使用const和let。因为二者以块为作用域,可以更早的进行垃圾回收
  3. 使用WeakMap和WeakSet
Last update: October 10, 2021 19:53
Contributors: youky7