js|垃圾回收机制和✌️✌️内存泄露

138 阅读3分钟

垃圾回收机制

1、概念

js运行代码时,需要给代码中的变量和值分配内存空间,当变量和值不在参与运算就需要被系统收回被占用的内存空间,这就是垃圾回收。

2、回收机制

  • Javascript 具有自动垃圾回收机制,会定期对那些不再使用的变量、对象所占用的内存进行释放,原理就是找到不再使用的变量,然后释放掉其占用的内存。
  • JavaScript中存在两种变量:局部变量和全局变量。全局变量的生命周期会持续到页面卸载;而局部变量声明在函数中,当函数执行结束后,这些局部变量不再被使用,它们所占有的空间就会被释放。
  • 不过,当局部变量被外部函数使用时,其中一种情况就是闭包,在函数执行结束后,函数外部的变量依然指向函数内部的局部变量,此时局部变量依然在被使用,所以不会回收。

3、回收方法

标记清除

第一步标记根

image.png

然后标记他们的引用

image (2).png

以及子孙代的引用

image.png

现在进程中不能访问的对象被认为是不可访问的,将被删除

image (3).png

引用计数

引用计数就是标记被引用的次数,当次数为0,就可以被回收,但是如果有循环引用的情况,那引用计数就会失效,因为引用次数永远不会为0

4、减少垃圾回收

数组

在清空一个数组时,最简单的方法就是给其赋值为[ ],但是与此同时会创建一个新的空对象,可以将数组的长度设置为0,以此来达到清空数组的目的。

对象

对于不再使用的对象,就将其设置为null,尽快被回收。

函数

在循环中的函数表达式,如果可以复用,尽量放在函数的外面。

内存泄露

1、内存泄露概念

内存泄露:由于错误或者疏忽程序没有释放已经不在使用的内存 无用的内存还在占用,得不到释放和归还,严重的时候无用的内存还在增加,导致整个系统的卡顿、奔溃

2、内存泄露的情况

以下四种情况会造成内存的泄漏:

意外的全局变量: 由于使用未声明的变量,而意外的创建了一个全局变量,而使这个变量一直留在内存中无法被回收。

被遗忘的计时器或回调函数: 设置了 setInterval 定时器,而忘记取消它,那么这个变量会被一直留在内存中,而无法被回收。

脱离 DOM 的引用: 获取一个 DOM 元素的引用,而后面这个元素被删除,由于一直保留了对这个元素的引用,所以它也无法被回收。

闭包: 不合理的使用闭包,从而导致某些变量一直被留在内存当中。

3、内存溢出概念

内存溢出:当程序执行时需要的内存超过剩余内存的时候,会发生内存溢出

参考👀

前端面试:谈谈 JS 垃圾回收机制