垃圾回收机制简介:
1.内存的回收只针对局部变量,因为全局变量直至浏览器关闭之前都是存在的.且局部变量在离开执行环境(作用域)时被自动销毁,全局变量和全局对象的属性可以赋给null,随后垃圾收集器下次运行时会检测到,从而释放内存.
2.垃圾收集器是按照一定的时间间隔去检查浏览器内存,然后释放不必要的变量内存.
3.浏览器被分给的内存是有限的,为了考虑性能,无用内存的释放显得格外必要.
变量清除方式
方式1:标记清除
(以chrome浏览器为典型代表,实际上各家浏览器2012年之后均已采用该策略)
标记的方式有很多,简而言之就是不再使用的变量(变量名与变量值之间不再有任何联系)会被做上标记,随后变量值占的内存就会被释放掉.
如图所示,对应代码应该是:
function test () {
//a,b,c都是局部变量
var a = 10;
var b = new object();
var c = b;//此时变量b与c指向同一个对象
}
当垃圾收集器运行时,读到标记然后将变量值占据的内存释放掉.
方式2:引用计数
(以万恶的IE浏览器早期版本为典型,low爆的一种方式,已经被弃用)
当一个值被一个变量引用时.这个值的引用次数就是1,当这个值再次被别的变量引用时引用次数就再加1.当引用该值的变量被赋值给另一个值时,引用次数就自动减1,直至引用次数为0.一般情况下,变量退出执行环境时,值的引用次数会被自行清至0,垃圾收集器检测到,清内存.
注:该方式有一个天大的bug,对循环引用无能为力
垃圾回收机制与闭包的一点关系:
person函数声明时,内存分配如图所示:
对应代码:
function person(name) {
var name = "mark";
var people1 = function () {
return name;
}
return people1;
}
var people2 = person();
console.log(people2()); //输出mark
当变量退出执行环境时,即person函数不再被调用时:
people2的内存不能被释放,就是闭包函数的缺点,当然也可以手动释放
people2 = null;
此时people2不再引用函数对象,等到垃圾收集器下次运行时,就可以释放内存.