您的位置:首页 > Web前端 > JavaScript

js 垃圾回收机制

2016-08-28 20:05 211 查看
目前JS的垃圾回收机制无非就是两种:1.标记清除(make-and-sweep) 2.引用计数(reference counting)

1.标记清除:标记清除简单的来说就是给各个变量名打上 YES or NO的标签以供JS引擎进行处理(当然打什么标签自己理解即可)。在和执行上下文类似的的环境中当变量名称进入环境的时候,那么变量会被打上 YES。一般来说是绝对不会释放被打上 YES 标签的变量内存的,一旦变量在出了该环境时,变会被打上 NO 标签(和作用域貌似有点像),JS引擎会在一定时间间隔或者设置的时间来进行扫描,对NO标签的进行剔除以释放其内存。

2.引用计数(查了很多资料,还是无法找到其真正的计算方式)

一般来说,引用计数的含义是跟踪记录每个值被引用的次数。当声明一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数便是1,如果同一个值又被赋给另一个变量,则该值的引用次数加1,相反,如果包含对这个值引用的变量又取得了另一个值,则这个值的引用次数减1。当这个值的引用次数为0时,说明没有办法访问到它了,因而可以将其占用的内存空间回收。

对于引用计数,我们需要知道如果具有循环引用,那么其计数问题就会暴露,导致计数永远不为0而无法释放内存,导致内存泄露,具体事例如下:

e.g.2

function(){

var a = {};

var b = {};

b.pro = a;

a.pro=b;

}

如果e.g.2使用引用计数的话就会导致问题,内存无法被释放,导致内存无故消耗占用。

除了一些极老版本的IE,目前市面上的JS引擎基本采用标记清除来除了垃圾回收。但是需要注意的是IE中的DOM由于机制问题,是采用了引用计数的方式,所以会有循环引用的问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: