js垃圾回收机制

164 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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的回收。