您的位置:首页 > Web前端 > JavaScript

JS中的垃圾回收机制

2017-06-22 21:50 225 查看
1.js中的内存管理

js具有自动的垃圾回收机制,也就是执行环境负责管理代码中使用的内存,在编写js时,不用像编写C语言那些需要手动跟踪内存的使用情况,而这种垃圾收集机制的原理很简单,就是定期找出不再使用的变量,然后释放其占用的内存,所以垃圾收集器就定期的执行这一操作。

2.局部变量的生命周期

js的局部变量只有当此函数执行的过程中存在,在执行的时候,会给当前变量在内存上分配相应的空间,用来存储他们的值,知道函数执行结束。此时局部变量就没有存在的意义,就可以释放其内存。

3.JS的几种垃圾收集方式

1.标记清除(这是JS种最常用的垃圾收集方式)

常用的标记状态有两种:

(1)进入环境:当变量进入环境时,就将这个变量标记为“进入环境”

(2)离开环境:当变量离开当前环境时,就标记为“离开环境”。

垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此之后再被加上的标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾收集器完成内存清除工作。销毁那些带标记的值并回收它们所占用的内存空间。


2.引用计数(有瑕疵)

引用计数的原理是跟踪记录每个值被引用的次数,当声明一个变量并将一个引用类型值赋给该变量的时候,其次数为1,如果同个值又赋给其他变量,则次数加一,相反,如果此变量被赋值其他值,则次数减一,当引用次数为0,就没办法访问这个值,就将其内存空间回收,这样当垃圾回收器下次再运行,就会释放次数为0的值占用的内存。

严重问题:(循环引用)

function problem(){
var obA=new Object();
var obB=new Object();
obA.A=obB;
obB.B=obA;
}


这两个对象通过各自属性相互引用,所以其次数永远不为0,导致占用大量内存。

4.管理内存

因为系统分配给Web浏览器的内存数量被限制,防止因js耗尽全部内存导致系统崩溃,但是内存的限制影响了一个线程中同时运行语句的数量,所以要确保占用最少内存可以让页面获得更好性能。

而最好的方式,就是只保存必要数据,一旦数据不再用,就将其值赋为null来释放引用——这种做法叫做解除引用,这种做法适用于全局属性,因为局部属性在离开执行环境时自动被解除引用。如下:

function A(name){
var localA=new Object();
localA.name = name;
return localA;
}
var B=A("AA");
//解除引用
B=null;


解除这个值的引用并不是自动回收其内存,而是让值脱离执行环境,让垃圾回收器下次运行时将其回收。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: