垃圾回收机制
首先我们要知道js的垃圾回收机制,就是找出不用的变量,释放掉其占用的内存。垃圾回收机制会按照固定的时间间隔周期性的执行。判断哪个变量没用有两个方法:标记清除和引用计数
标记清除
当变量进入环境时,例如,在函数中声明一个变量,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其标记为“离开环境”。
1 function test(){ 2 var a=10; //被标记,进入环境 3 var b=20; //被标记,进入环境 4 } 5 test(); //执行完毕之后a、b又被标记离开环境,被回收
引用计数
引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数减1。当这个值的引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾回收器下次再运行时,它就会释放那些引用次数为0的值所占用的内存。
1 function test(){ 2 var a={}; //a的引用次数为0 3 var b=a; //a的引用次数加1,为1 4 var c=a; //a的引用次数加1,为2 5 var b={}; //a的引用次数减1,为1 6 }
哪些操作会造成内存泄漏?
1、意外的全局变量引起的内存泄漏(定义在函数的全局变量)
2、闭包引起(闭包可以维持函数内部的局部变量,使其不得释放)
3、没有清理的DOM元素引用
4、被遗忘的定时器或者回调
参考自:https://blog.csdn.net/michael8512/article/details/77888000