在JS中,对于任何变量、对象、数组、实例等等这些,都会消耗我们的内存和资源,为了节省资源和提高速度,在JS中,他是如何处理我们已经不再使用的变量数组等呢?
程序的运行需要内存,程序运行中的各种操作需要消耗资源和内存,程序运行中生成的各种数据也需要内存。若不及时释放内存,则内存的占用越来越高,轻则影响程序和系统的性能,重则导致进程或系统的崩溃。 没有即使释放不再使用的内存,就称为内存泄漏。 对于有的语言能够进行自动化内存管理,称为垃圾回收机制
JS的垃圾回收机制会定期(周期性)找出那些不再用到的内存(变量),然后释放其内存。 很简单,对于我们不再使用的内容,就会视为垃圾处理掉。而对于不再使用的值,则会被垃圾回收。(注意可访问性)
等等等等。
这是JS中最常用的垃圾回收方式,它通过给所有的变量都标上一个标记,然后再追溯到他们的引用并继续标记,就这样一直标记下去,一直到有未访问(不可访问)的引用为止,除了标记了的对象以外,其他所有对象都被删除。
例如:(图片来源:思否.前端小智)
这是一个对象结构: 看看垃圾回收机制的流程
第一,从根开始标记:
第二,标记他们的引用:
第三,标记他们子孙代的引用,以此类推:
第四,除了标记的对象以外,其他所有对象都被删除:
这就是垃圾回收机制的原理。JS中还有许多对此的优化:
根据被引用的次数。 当声明一个变量并将一个引用类型赋值给该变量时,这个值得引用次数就 +1,相反,如果包含对这个值引用的变量又取得了另外一个值,这个值得引用次数就 -1,当这个值得引用次数变为0的时候,就说明没有办法再访问这个值了,因而就可以将其所占的内存空间给收回来。 这样,垃圾收集器下次再运行时,就会释放哪些引用次数为0所占的内存。 但这样会存在一些问题:
function problem(){
var objA = new Object();
var objB = new Object();
objA.someOtherObject = objB;
objB.someOtherObject = objA;
}
复制代码
上面的代码里,objA
和objB
通过各自的属性相互引用着,那他们的引用次数将一直是 2,再引用计数策略中,函数执行完后,使用的是 var
,objA
和objB
还将会存在,所以造成了内存泄漏。需要手动切断他们的循环引用。
对于JS垃圾回收机制,自然是越少越好,当然是垃圾的生成越少越好,我们可以用一些方法减少垃圾回收,例如手动进行内存释放:
let arr = [a,b,c,d,e,f];
arr.length; // 将长度设置为0释放内存
let obj = {
name: "小明",
age: 18,
}
obj = null; // 清除引用释放内存
// 等等。。。
复制代码
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。