一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情。
前言
js的垃圾回收机制,之前也听到过,但总是对这个概念有点模糊,因为在实际的开发中感觉并没有过多的接触,我唯一接触的,用的最多的时候也就是清除定时器的时候吧,今天抽空再学习一下。
js中内存的分配和清除
在js中,内存的分配是不用我们管的,在变量、函数、对象的创建过程中,js会自动为我们分配好内存。js除了能给我们自动分配内存外还能自动的为我们释放内存(也就是垃圾回收机制),但是往往在释放的过程中可能出现问题。那到底垃圾回收回收的是什么呢?垃圾回收的其实是那些不在被引用的对象,变量等内容,如下代码
var a='小白' //a引用了小白
var b='小黑'//b运用了小黑
a=b //这里a被重新赋值,这时候小白相当于就没人引用了,因此小白所占用的内存会被垃圾回收了
但是如果你声明了一个全局变量,如果不管它它就会一直存在,直到你从新给它赋值了。
局部变量 局部变量就比较特殊了,先看下边代码:
function fn(){
var b=2
console.log(b)
}
上述代码中的b,也就是局部变量,只有在函数执行的时候才会分配内存,当函数执行完就会释放内存。
js内存清除的方法
- 引用计数,这是比较简单的垃圾回收算法。顾名思义,也就是看被引用的数量,如果被引用的数量为0就给回收了,这种清理方式存在这漏洞,如果遇到循环引用的情况就会造成内存泄露。
- 标记-清除算法,这种清除方式是从window开始遍历,遍历到了就打一个引用的标记,剩下的都标记为可删除,然后删掉这些标记为可删除的。
两种清除的优缺点
- 引用计数:
优点:能够随时回收;对js的执行影响小
缺点:计数器的每次增加和减小太频繁;计数器也要占内存;循环应用的没法回收
- 标记清除
优点:可以分代回收;可以在空闲时间执行;可以分多次执行,不需要一次执行完垃圾回收
缺点:标记的效率低;执行回收的时候会影响js的执行;垃圾回收的时候js不能同时执行
总结
js中的垃圾回收大概就这样,详细的还待再次研究,除了上述垃圾回收外js还要记得考虑dom的回收。