今天突然想起了JS的垃圾回收机制,下面来简单说一下,不足之处还请大神指教
有一本资料书有大概有这么一段话,大致是这么说的
由于字符串,数组,对象的大小不定,所以只有知道他们的大小之后才能动态给他们分配内存空间
JS 程序每次创建字符串,数组,对象时,解释器都要动态给他们分配内存空间来存储这个实体。像这样
需要动态来分配内存空间的,最终都要释放这个内存,以便这个内存能够被再次使用、不然的话,JS 解释器
会消耗完系统中可用的内存。造成内存泄漏。
JS解释器可以检测到程序何时不再使用一个对象了,确定不再使用时,然后把它所占的内存释放掉。
例:
var a="before";
var b="after";
a=b;
这时刚才的a=“before”,before就没有被用了,因为a此时指向了after。所以before所点的内存就会被释放掉。
再说下垃圾回收的原理,
常用的有两种
1,标记清楚。这个是用的最多的,
当变量进入执行环境,就会被标记为进入环境,离开环境后会被标记为离开环境,在环境中的变量不会被
释放,因为随时可能被用到,
垃圾收集器在运行时会给内存中所有的变量加上标记,但是会去掉那些环境中的变量,以及被环境中的变量引用的
变量,如果后续在被加上标记就会被视为准备删除的变量。最后垃圾收集器销毁这些带标记的变量,回收他们所
占的内存。
2.引用计数
引用计数的意思是说。当声明一个变量后,这个变量指向的内存地址就会标记为1(因为被这个值被引用了一次)
如果还有变量等于这个值,就会再加1。相反就会减1.当等于0时,就表示没有被引用了,就会被回收。
这种方法有缺陷。如果两个变量相互引用时,就会导致标记值永远不会等于0.内存永远不会被回收。如果很多就会出
内存泄漏。
例;
var a = new Object();
var b = new Object();
a.someVal = b;
b.someNumber =a ;
a和b通过各自属性的相互引用,两个对象的引用次数都 是0;