内存泄漏通常是由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。这里就讲一些常见会带来内存泄露的原因
1.全局变量
由于JavaScript对未声明变量的处理方式是在全局对象上创建该变量的引用。如果在浏览器中,全局对象就是window对象。
变量在窗口关闭或重新刷新页面之前都不会被释放,如果未声明的变量缓存大量的数据,就会导致内存泄露。
2.循环引用
在js的内存管理环境中,对象 A 如果有访问对象 B 的权限,叫做对象 A 引用对象 B。引用计数的策略是将“对象是否不再需要”简化成“对象有没有其他对象引用到它”,如果没有对象引用这个对象,那么这个对象将会被回收 。
3.闭包
闭包会造成对象引用的生命周期脱离当前函数的上下文,如果闭包如果使用不当,可以导致环形引用(circular reference),类似于死锁,只能避免,无法发生之后解决,即使有垃圾回收也还是会内存泄露
4.延时器/定时器
setInterval/setTimeout 中的 this 指向的是window对象,所以内部定义的变量也挂载到了全局;if 内引用了 someResource 变量,如果没有清除 setInterval/setTimeout 的话someResource 也得不到释放;同理其实 setTimeout 也一样。所以我们用完需要记得去 clearInterval/clearTimeout。
5.DOM引起的内存泄露
① 未清除DOM引用
② DOM对象添加的属性是一个对象的引用
③ 给DOM对象绑定事件
6.其他原因
console.log打印的对象不能被垃圾回收,可能会导致内存泄露。
————————————————————————————————————————
前端如何检查内存泄露?
(1).使用Chrome的开发者工具profiles来进行快照对比。
(2).如果是在Node环境下,可以用Node提供的process.memoryUsage()方法来检查内存泄露
如何处理内存泄漏?
变量导致的内存泄露,将变量清除 a = null 即可。
事件监听导致的内存泄露,监听后移除即可。