内存管理中的内存,指的是系统分配给浏览器的内存。出于安全的考虑,系统分配给web浏览器的内存通常都要比其它桌面程序要少。这也影响了给变量分配内存,同时还会影响调用栈以及在一个线程中能够同时执行的语句数量。
因此,确保占用最少的内存,可以让页面获得更好的性能。优化内存最好的方式,就是通过给不再使用的全局变量赋值为null,这样可以释放变量的引用 --------这个方法叫做解除引用。这种做法适用于全局变量以及全局变量的属性;下面来看一个例子:
function test (name) {
var localPerson = new Object();
localPerson.name = name;
return localPerson;
}
var globalPerson = test("feifei");
console.log(globalPerson);
// 手动解除globalPerson的引用
globalPerson = null;
这个例子中,全局对象globalPerson获得了由函数test返回的的localPerson对象,然后在经过手动解除引用之后,全局变量globalPerson只是脱离了执行环境,需要到垃圾收集器下次运行的时候才会将其回收。 在函数执行过程中,也创建了一个局部变量localPerson,但由于这是局部变量,所以在函数执行完之后就会自动销毁,等待垃圾收集器回收。有关js变量的生命周期可点此了解。
垃圾收集器:
JavaScript是具备垃圾自动回收机制的语言,其原理是每隔一段时间会执行一次垃圾回收;其回收机制的原理就是:找出那些不再使用的变量,然后释放其所占用的内存。至于是如果找到那些不再使用的变量,目前所有的主流浏览器都是使用标记清除的方式。
标记策略:
垃圾收集器在运行的时候,会给存储在内存中的所有变量都加上标记,然后去掉正在环境中的变量,以及被环境中的变量所引用的变量的标记。此时剩下的被标记了的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了,垃圾回收器完成清除工作之后,变量被正式销毁并回收所对应被占用的内存。
还有一种策略叫做引用计数,不过该策略现在已经被舍弃了,只有在老版本的IE上才会使用。IE9 包括以上版本都不再使用引用计数的策略。
在IE和Opera浏览器中,我们可以手动调用垃圾回收器立即执行,但我们如果正确编写了代码,也无需这样操作,也不建议大家这样子做。
立即执行垃圾收集方法:
IE:window.CollectGarbage();
Opera:window.opera.collect();