JS的垃圾回收机制

141 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

什么是垃圾回收机制

学了一定时间编程的人,或多或少听过垃圾回收机制这个名词。大学刚学习C语言的时候老师总是说要手动释放内存,free一下。JS与C语言不同,它有自己的垃圾回收机制。

说到垃圾回收机制,那么什么是垃圾呢?在写程序的时候免不得要定义变量,变量有全局变量,有局部变量,全局变量在程序的各个位置都能访问,但是局部变量只在特定的地方才能访问。显然执行完的局部变量就是一种"垃圾"。例如这个例子:

let num = 1
let addNum = function() {
    let num = 2
    num++
}
addNum()

addNum中的变量num在addNum()函数执行完就没有用处了,若是仍然留在内存里,内存占用就会越来越高。可能会影响系统性能甚至导致进程崩溃。

还有引用的变量,当指向改变,没有变量指向的时候,也是一种"垃圾"。

垃圾回收算法

  1. 标记清除 当变量进入环境的时候,例如执行函数时,给变量进行标记。当变量离开环境时,例如函数执行完毕,再给变量进行标记。这样垃圾回收器就可以准确识别并对无用的变量进行清除回收。

2.引用计数 引用类型的值被变量引用的时候记录引用的次数,每引用一次加一。当变量指向改变,即引用类型的值不被引用时次数减一。当引用次数变为0时,垃圾收集器在运行时就会释放这个引用次数为0的内存。

注意

  1. 前端在垃圾回收的同时需要清除dom和js
  2. 有时候仍需要手动回收,例如无用的全局变量