了解js的垃圾回收机制这个问题,不论是对于当前的面试,还是在js的开发工作往更深一层走的话都是有很大的帮忙
垃圾回收
平时js的开发过程中,咱们所创立的根本数据类型和援用数据类型,要都是须要开拓内存空间能力运行的,否则就会存在内存溢出、泄露之类的危险。
要晓得的是:js中的内存治理是对用户不可见的,且主动执行的。
关注点:js引擎如何解决咱们不再须要的那些数据类型从而开释内存,这就是js的垃圾回收机制。
什么样的数据会被回收
简略来说,一个数据类型的申明周期完结之后,就会被回收,他的内存也会被开释。
全局变量生命周期会继续到会话敞开
局部变量的生命周期在函数执行结束之后就完结了
常常被提起的两种js垃圾回收形式
标记革除
大部分浏览器用这种办法进行垃圾回收。当变量被申明进入js的执行环境,垃圾回收器对其进行标记状态“进入环境”,在变量完结生命周期后标记为“来到环境”。
带有“在以后执行环境中的变量”标记的变量都不会被革除,其余的变量都会被革除回收。
它会去掉处在环境中的变量及被环境中的变量援用的变量标记(闭包)。而在此之后剩下的带有标记的变量被视为筹备删除的变量
垃圾回收机制是依照肯定的周期运行的
“根”的概念
还有一种解释办法是阐明“根”的概念
https://segmentfault.com/a/11...
援用计数
低版本的ie应用这种形式,会有内存泄露的危险。
机制为跟踪变量的援用次数:申明变量并将一个援用类型赋值给该变量时该值援用次数加1,当这个变量指向其余值时该值的援用次数便减1,援用次数为0时进行回收。
该形式会引起内存透露的起因是它不能解决循环援用的问题
function sample(){ var a={}; var b={}; a.prop = b; b.prop = a;}
这种状况下每次调用sample()函数,a和b的援用计数都是2,会使这部分内存永远不会被开释,即内存透露。
低版本IE中有一部分对象并不是原生JS对象。例如,其BOM和DOM中的对象就是应用C++以COM(Component Object Model)对象的模式实现的,而COM对象的垃圾收集机制采纳的就是援用计数策略。
因而即便IE的js引擎是用的标记革除来实现的,然而js拜访COM对象如BOM,DOM还是基于援用计数的策略的,也就是说只有在IE中设计到COM对象,也就会存在循环援用的问题。
对于全局或者始终存在于执行环境中的变量,须要时能够手动置空开释内存