了解 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 对象,也就会存在循环援用的问题。
对于全局或者始终存在于执行环境中的变量,须要时能够手动置空开释内存