原因:
当一块内存不再用到,但是垃圾回收机制又无法释放这块内存的时候,就导致内存泄漏
影响
内存泄露会因为减少可用内存数量从而降低计算机性能,严重的可能导致设备停止正常工作,或者应用程序崩溃。
内存泄漏的几种场景
- 闭包只是让内存常驻,滥用闭包才会导致内存泄漏。闭包可以读取函数内部的变量,然后让这些变量始终保存在内存中。如果在使用结束后没有将局部变量清除,就可能导致内存泄露。
- 对同一个事件重复监听,但是忘记移除,会导致内存泄露。
- console.log打印的对象不能被垃圾回收,可能会导致内存泄露。
- setInterval也可能会导致内存泄漏
解决方法
- 不要滥用闭包,对于不再使用的变量,值设置为null,将变量清除即可。 另一种方法是 使用立即执行函数,函数执行完就销毁。
- 事件监听导致的内存泄露,监听后移除即可
- 对于console.log, 安装一个webpack插件,项目打包构建时,移除console.log
- setInterval 不需要使用时,记得清除,最晚也要在页面卸载时清除
怎么发现内存泄露了
- 通过chrome浏览器的performance面板记录页面活动,然后在页面上进行各种交互操作,过一段时间后,停止记录,生成统计数据,然后看timeline下部的内存变化趋势图,如果是有规律的周期平稳变化,则不存在内存泄漏,如果是整体趋势上涨,则说明存在内存泄漏。
- 通过DynaTrance (IE) profiles等工具一段时间收集数据,观察对象的使用情况,然后判断是否存在内存泄漏,修改验证。