JS中的垃圾回收机制

来源:互联网 发布:架子鼓训练软件安卓版 编辑:程序博客网 时间:2024/06/08 16:12

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;

解除这个值的引用并不是自动回收其内存,而是让值脱离执行环境,让垃圾回收器下次运行时将其回收。

原创粉丝点击