垃圾处理机制
js具备自动垃圾收集机制,也就是说,
执行环境会管理代码执行过程当中的使用的内存。在部分编程语言中(例如C语言)开发人员的一项基本的任务就是手工跟踪内存的使用状况,这是形成了不少性能问题的一个根源。在写js程序的时候,开发人员不用再关心内存的使用状况,全部的不须要的内存垃圾都会被自动管理
js的垃圾回收机制很简单就是找出再也不继续使用的变量,而后释放它所占用的内存,js会周期性的回收这些内存,那么咱们有一个很简单的问题,js是怎么判断变量不被须要呢?
还记得咱们以前说过“堆”和“栈”的概念么?其实奥秘就在这里面,全部咱们能引用到的变量都是存放在栈中的堆的引用(画个图吧)
也就是说咱们在引用的变量都仅仅是内存中变量的映射,而不可能直接用内存中的变量,而在每次引用的时候堆中的变量都会被打上一个标记,打上标记以后就表明它被引用这。 因此JS就周期性的查看内存中各个堆的变量是否有标记,若是没有就表明着外面栈中彻底没有人在用,就该被清除掉了
上面的文字说的很简单,单具体到浏览器实现的方式上有两个策略:
标记清除
这是最经常使用的垃圾收集方式,当变量进入环境的时候将这个变量标记为“进入环境”。js永远不能释放进入环境的变量所占得内存,由于只要进入了相应的环境就有可能会用到它,最后当变量离开环境的时候就标记成“离开环境”,等待js周期性的释放其中的内存
目前:IE,FireFox,Opera,Chrome和Safari运行的js引擎都是按照这个策略来清理内存的
引用计数
这种方式不是很常见,顾名思义是跟踪每一个变量被引用的次数,当js引擎周期性的来清理缓存的时候把引用数量是0的给清除掉就能够了 这种方式在部分老版本的IE浏览器中在使用