一、引用计数(Reference Counting)算法

  Internet Explorer 8以下的DOM和BOM使用COM组件所以是引用计数来为DOM对象处理内存,引用计数的含义是跟踪记录每个值被引用的次数。形象点说:

  1)房子里有很多便签纸,这些纸就好比是内存。如下图:

  

  2)使用内存,就好比在这些纸上写字。但是,有个条件,任何使用一张纸的人,必须在纸的一角写上计数1,如果2个人同时使用一张纸,那么计数就变成2,以此类推。当一个人使用完某张纸的时候,必须把角上的计数减1,这样,一旦当计数变为0,就满足了垃圾回收条件,等在一旁的机器人会立即把这张纸扔进垃圾箱。但这个算法存在一个缺陷,就是一旦产生循环引用,内存就会被泄露。

  

  

 

二、标记-清除(Mark-Sweep)算法

  当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。形象点说:

  1)领导发给职员们一些便签纸,随便用,不需要做什么记号。

  

  2)用到某个时候,领导命令所有人停下来,这时,每个人将自己仍然需要使用的白纸上做一个记号。

  

  3)最后领导会把那些没有记号的白纸全部扔进垃圾箱。

  

  4)这个算法的缺陷也很明显,首先是效率问题,为了标记,必须暂停程序,长时间进行等待。

       其次,标记清除算法会造成内存碎片,比如被标记清除的只是一些很小的内存块,而我们接下来要申请的都是一些大块的内存,那么刚才清除掉的内存,其实还是无法使用。

 

三、复制(copying)算法

  mark-sweep算法效率低下,由此,又产生了一种新的算法。

  1)把便签纸分成两份

  

  2)所有人都在左边,便签纸随便用,当领导说停下来,这次不做记号,只要带着还需要的便签纸转移到右边去就可以。

  

  3)那些没用的纸自然就剩了下来,然后把这些纸扔到垃圾箱中,下次执行垃圾回收的时候采用同样的方式,只不过这次从右边向左边迁移。

  

  4)这种算法的效率奇高,可惜,对内存的消耗太大,尤其是在1960年,内存可比黄金贵多了,直接砍掉一半的内存,显然是无法接受的。

 

 

 

参考资料:

http://kb.cnblogs.com/page/74836/ GC与JS内存泄露

http://www.cnblogs.com/hyddd/archive/2013/02/07/2908598.html Javascript垃圾回收浅析

http://blog.jobbole.com/49084/ JavaScript 垃圾回收

http://kb.cnblogs.com/page/137723/ 减少javascript垃圾回收[译]

 posted on 2014-10-14 09:19  咖啡机(K.F.J)  阅读(1376)  评论(2编辑  收藏  举报