垃圾回收机制
1、概念
js运行代码时,需要给代码中的变量和值分配内存空间,当变量和值不在参与运算就需要被系统收回被占用的内存空间,这就是垃圾回收。
2、回收机制
- Javascript 具有自动垃圾回收机制,会定期对那些不再使用的变量、对象所占用的内存进行释放,原理就是找到不再使用的变量,然后释放掉其占用的内存。
- JavaScript中存在两种变量:局部变量和全局变量。全局变量的生命周期会持续到页面卸载;而局部变量声明在函数中,当函数执行结束后,这些局部变量不再被使用,它们所占有的空间就会被释放。
- 不过,当局部变量被外部函数使用时,其中一种情况就是闭包,在函数执行结束后,函数外部的变量依然指向函数内部的局部变量,此时局部变量依然在被使用,所以不会回收。
3、回收方法
标记清除
第一步标记根
然后标记他们的引用
以及子孙代的引用
现在进程中不能访问的对象被认为是不可访问的,将被删除
引用计数
引用计数就是标记被引用的次数,当次数为0,就可以被回收,但是如果有循环引用的情况,那引用计数就会失效,因为引用次数永远不会为0
4、减少垃圾回收
数组
在清空一个数组时,最简单的方法就是给其赋值为[ ],但是与此同时会创建一个新的空对象,可以将数组的长度设置为0,以此来达到清空数组的目的。
对象
对于不再使用的对象,就将其设置为null,尽快被回收。
函数
在循环中的函数表达式,如果可以复用,尽量放在函数的外面。
内存泄露
1、内存泄露概念
内存泄露:由于错误或者疏忽程序没有释放已经不在使用的内存 无用的内存还在占用,得不到释放和归还,严重的时候无用的内存还在增加,导致整个系统的卡顿、奔溃
2、内存泄露的情况
以下四种情况会造成内存的泄漏:
意外的全局变量: 由于使用未声明的变量,而意外的创建了一个全局变量,而使这个变量一直留在内存中无法被回收。
被遗忘的计时器或回调函数: 设置了 setInterval 定时器,而忘记取消它,那么这个变量会被一直留在内存中,而无法被回收。
脱离 DOM 的引用: 获取一个 DOM 元素的引用,而后面这个元素被删除,由于一直保留了对这个元素的引用,所以它也无法被回收。
闭包: 不合理的使用闭包,从而导致某些变量一直被留在内存当中。
3、内存溢出概念
内存溢出:当程序执行时需要的内存超过剩余内存的时候,会发生内存溢出