垃圾回收算法
一、引用计数(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年,内存可比黄金贵多了,直接砍掉一半的内存,显然是无法接受的。