变量、作用域、内存---part6

217 阅读2分钟

垃圾处理机制

js具有自动垃圾收集机制,也就是说,执行环境会管理代码执行过程中的使用的内存。在部分编程语言中(例如C语言)开发人员的一项基本的任务就是手工跟踪内存的使用情况,这是造成了很多性能问题的一个根源。在写js程序的时候,开发人员不用再关心内存的使用情况,所有的不需要的内存垃圾都会被自动管理
js的垃圾回收机制很简单就是找出不再继续使用的变量,然后释放它所占用的内存,js会周期性的回收这些内存,那么我们有一个很简单的问题,js是怎么判断变量不被需要呢?
还记得我们之前说过“堆”和“栈”的概念么?其实奥秘就在这里面,所有我们能引用到的变量都是存放在栈中的堆的引用(画个图吧)

也就是说我们在引用的变量都仅仅是内存中变量的映射,而不可能直接用内存中的变量,而在每次引用的时候堆中的变量都会被打上一个标记,打上标记之后就代表它被引用这。 所以JS就周期性的查看内存中各个堆的变量是否有标记,如果没有就代表着外面栈中完全没有人在用,就该被清除掉了
上面的文字说的很简单,单具体到浏览器实现的方式上有两个策略:

标记清除
这是最常用的垃圾收集方式,当变量进入环境的时候将这个变量标记为“进入环境”。js永远不能释放进入环境的变量所占得内存,因为只要进入了相应的环境就有可能会用到它,最后当变量离开环境的时候就标记成“离开环境”,等待js周期性的释放其中的内存
目前:IE,FireFox,Opera,Chrome和Safari运行的js引擎都是按照这个策略来清理内存的
引用计数
这种方式不是很常见,顾名思义是跟踪每个变量被引用的次数,当js引擎周期性的来清理缓存的时候把引用数量是0的给清除掉就可以了
这种方式在部分老版本的IE浏览器中在使用