垃圾收集机制的原理:
在我们编写JS的过程中,内存的分配以及内存的回收会通过垃圾收集器按照固定的时间间隔,周期性的找出不再继续使用的变量,然后释放其占用的内存来进行自动管理。在代码执行过程中当变量被声明的时候,将这个变量标记为“进入环境”,它只在函数的执行过程中存在,当函数运行结束,这些变量没有再被引用将要离开环境的时候,这些变量就会被标记为“离开环境”被回收内存。这时垃圾收集器会执行最后一步内存清除的工作,销毁那些带“离开环境”标记的值并回收它们所占用的内存空间。
但全局变量的生命周期则会一直到浏览器卸载页面才会结束,也就是说全局变量不会被当成垃圾回收。
内存泄漏:
由于疏忽或错误造成程序未能释放那些已经不再使用的内存,造成内存的浪费。基本类型的值存在内存中,被保存在栈内存中,引用类型的值是对象,保存在堆内存中。所以对象、数组之类的,才会发生内存泄漏
造成泄露的原因:
当不需要setInterval
或者setTimeout
时,定时器没有被clear,定时器的回调函数以及内部依赖的变量都不能被回收,造成内存泄漏。
解决方法:定时器完成工作的时候,手动清除定时器。
闭包可以维持函数内局部变量,使其得不到释放,造成内存泄漏。
解决方法:手动解除引用,obj = null
。
没有清理DOM元素引用:
解决办法:refA = null;
console保存大量数据在内存中。
解决:合理利用console,尽量少的使用console,且使用完要记得注释掉。
避免内存泄漏的建议:
- 尽量避免全局变量的使用
- dom引用要及时解除
- 闭包中的变量,定时器清除
- 避免死循环