内存溢出与内存泄漏

1.内存溢出

  • 一种程序运行出现的错误
  • 当程序运行需要的内存超过了剩余的内存时,就会抛出内存溢出错误

例如,下面这一段程序

1
2
3
4
var obj = {};
for (var i = 0; i < 10000; i++) {
obj[i] = new Array(1000000);
}

当运行时,浏览器会报错:内存不足

说明:内存是有限的资源,不能无限制地进行分配!

2.内存泄漏

  • 占用内存没有被及时释放
  • 内存泄漏积累多了就容易导致内存溢出
  • 常见的内存泄漏:
    ※ 意外的全局变量
    ※ 没有及时清理的计时器或者回调函数
    ※ 闭包

⭐ 意外的全局变量

1
2
3
4
5
6
function fn () {
a = 3;
console.log(a);
}

fn();

上述代码中,变量a实际上是全局变量,以这种方式定义时,变量不会随着fn函数的执行完成而释放。

⭐ 没有及时清理的计时器或者回调函数

1
2
3
4
// 启动循环定时器后不清理
var intervalId = setInterval(function () {
console.log('-----------------');
}, 1000)

由于没关闭定时器而导致内存溢出,除非浏览器关闭、刷新,不然的话会一直执行下去。因此需要及时清理定时器。

1
clearInterval(intervalId);

⭐ 闭包

1
2
3
4
5
6
7
8
9
function fn1() {
var a = 2
function fn2() {
console.log(++a)
}
return fn2
}
const fn = fn1()
fn()

执行完函数之后a没有被释放掉,是因为fn保存了fn1函数。
因此需要将fn置为空,让垃圾回收器回收。

1
fn = null;
文章作者: qinwei
文章链接: https://qw-null.github.io/2022/03/20/内存溢出与内存泄漏/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 QW's Blog