js具有自动垃圾回收机制,执行环境会负责管理代码执行过程中使用的内存。
首先先看看js分配内存的生命周期:
内存分配:当我们申明变量、函数、对象的时候,系统会自动为他们分配内存
内存使用:即读写内存,也就是使用变量、函数等
内存回收:使用完毕,由垃圾回收自动回收不再使用的内存
通过js的内存生命周期可以看出,js的垃圾回收机制的原理:找到那些不再继续使用的变量,然后释放其所占用的内存。那么js如何判断内存已经不再使用呢?
js的垃圾回收机制我个人的理解是跟js本身没关系,而是与所处的环境有关,当然,大多数的环境其实就是浏览器。比如IE6/IE7/IE8采用的是引用计数的方法,IE9等、Firefox、Opera、Chrome、Safari采用的是标记清除的方法或类似的策略。
下面解释一下标记清除与引用计数
标记清除
js中最常用的垃圾回收方式就是标记清除。标记清除简单的来说就是给各个变量名打上对应的标签以供js引擎进行处理。JS引擎会在一定时间间隔或者设置的时间来进行扫描。当变量进入环境时,就将这个变量标记为“进入环境”(也有说是“到达对象”,或者简单的就是“yes”,总之这个标签可自行理解)。从逻辑上讲,绝对不会释放被打上 “进入环境”标签的变量内存的,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其标记为“离开环境”。具体的分析请看:http://blog.csdn.net/yuezhiren/article/details/7948950
引用计数
引用计数的含义是跟踪记录每个值被引用的次数。当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是1。如果同一个值又被赋给另一个变量,则该值的引用次数加1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数减1。当这个值的引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。这样,当垃圾回收器下次再运行时,它就会释放那些引用次数为0的值所占用的内存。详细请看:http://blog.csdn.net/hou478410969/article/details/7530032
未经允许不得转载:前端撸码笔记 » js中的垃圾回收机制