JS 的垃圾回收机制浅析

今天突然想起了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;

posted @ 2019-04-12 16:19  zyh-code  阅读(873)  评论(0编辑  收藏  举报