垃圾回收机制——必会知识

187 阅读3分钟

前言

当一个变量不再被使用的时候,我们需要将其释放掉,不能让它一直存在我们的内存中。今天跟着本文的脚步一起看下js中的垃圾回收机制吧~


一、什么是垃圾回收机制?

JS 的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时,这块内存还存在着,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。

二、垃圾回收方式

1. 标记清除(mark and sweep)

这是 JavaScript 最常见的垃圾回收方式,当变量进入执行环境的时候,比如函数中声明一个变量,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”。

垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记,然后去掉环境中的变量以及被环境中变量所引用的变量(闭包),在这些完成之后仍存在标记的就是要删除的变量了。

2. 引用计数(reference counting)

在低版本 IE 中经常会出现内存泄露,很多时候就是因为其采用引用计数方式进行垃圾回收。

引用计数的策略是跟踪记录每个值被使用的次数,当声明了一个 变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加 1,如果该变量的值变成了另外一个,则这个值得引用次数减1,当这个值的引用次数变为 0 的时候,说明没有变量在使用,这个值没法被访问了,因此可以将其占用的空间回收,这样垃圾回收器会在运行的时候清理掉引用次数为 0 的值占用的空间。

在 IE 中虽然 JavaScript 对象通过标记清除的方式进行垃圾回收,但 BOM 与 DOM 对象却是通过引用计数回收垃圾的,也就是说只要涉及 BOM 及 DOM 就会出现循环引用问题。

三、 常用的垃圾回收机制

JS 中最常见的垃圾回收方式是标记清除

1. 工作原理

是当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。

标记“离开环境”的就回收内存。

2. 工作流程

  • 垃圾回收器,在运行的时候会给存储在内存中的所有变量都加上标记
  • 去掉环境中的变量以及被环境中的变量引用的变量的标记
  • 再被加上标记的会被视为准备删除的变量
  • 垃圾回收器完成内存清除工作,销毁那些带标记的值并回收他们所占用的内存空间

总结

come on~