JS的回收机制分两种:1.标记清除 2.引用计数。各大浏览器常用的是前者.这两种回收机制的过程都比较清晰易懂。
标记清除:是对于脱离作用域的变量进行回收。当进入作用域时,进行标记,离开作用域时,标记并回收这些变量。
引用计数:是记录每个变量的被引用情况,每当过一段时间开始垃圾回收的时候,就把被引用数为0的变量回收。这个问题可能导致循环引用,类似死锁。这样变量就永不会被销毁。。
由于每次的垃圾回收开销都相对较大,并且由于机制的一些不完善的地方,可能会导致内存泄露。我们可以利用一些方法减少垃圾回收,并且尽量避免循环引用的问题。
1.在对象结束使用后 ,令obj = null。这样利于解除循环引用,使得无用变量及时被回收
2.js中开辟空间的操作有new(), [ ], { }, function (){..}。在创建新对象的时候要尽量考虑增大对象的复用性。
垃圾回收看多了就容易和C的内存泄露方式弄混了。。
setInterval(function(){
var a = new document.getElementByTagName("p");
},1000);
这样一段代码,每秒都不断的调用匿名函数,生成一个p元素。这样虽然对性能影响比较大(因为开辟新空间的花费),但是不会引起泄露,由于JS的垃圾回收,在调用完匿名函数之后,会销毁a和其指向的空间。
3.闭包。闭包容易引起内存泄露。本来在函数返回之后,之前的空间都会被回收。但是由于闭包可能保存着函数内部变量的引用,且闭包在外部环境,就会导致函数内部的变量不能够销毁。慎用闭包!