javascript中垃圾回收机制

简介

Chrome 浏览器垃圾回收机制与内存泄漏分析

JavaScript 创建变量(对象,字符串等)时分配内存,并且在不再使用它们时“自动”释放。 后一个过程称为垃圾回收。这个“自动”是混乱的根源,并让 JavaScript(和其他高级语言)开发者感觉他们可以不关心内存管理。而不是别人所说的:编写 JavaScript 程序时,所需内存的分配以及无用内存的回收完全实现自动管理但是他会按照固定的时间间隔(或代码执行中预定的收集时间)周期性地执行这一操作

## 内存生命周期

其实别的语言的内存声明周期基本是那个是一致的:

1. 分配你所需要的内存
2. 使用分配到内存(读、写)
3. 不需要时将其释放\归还

### JavaScript 的内存分配

1. JavaScript 在定义变量时就完成了内存分配
2. 通过函数调用分配内存

### 内存释放

当内存不再需要使用时释放,高级语言解释器嵌入了“垃圾回收器”,它的主要工作是跟踪内存的分配和使用,以便当分配的内存不再使用时,自动释放它。

## 两种垃圾回收方式

浏览器的内存处理基本分为两种,引用技术垃圾收集标记清除两种,下面一一介绍。

### 引用计数

这是最简单的垃圾收集算法。此算法把“对象是否不再需要”简化定义为“对象有没有其他对象引用到它”。如果没有引用指向该对象(零引用),对象将被垃圾回收机制回收。
但是他有比较大的限制,就是当对象循环引用,引用计数不会回收它

标记清除

垃圾收集器会按照固定的时间间隔周期性的执行这一操作。
从 2012 年起,所有现代浏览器都使用了标记-清除垃圾回收算法。所有对 JavaScript 垃圾回收算法的改进都是基于标记-清除算法的改进,并没有改进标记-清除算法本身和它对“对象是否不再需要”的简化定义。
简单来讲就是,当变量进入环境时,就是将变量标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。
收集器在运行时会给存储在内存中的所有变量都加上标记,然后它会去掉环境中的变量以及被环境中的变量引用的变量的标记。剩下的在被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量。最后,垃圾收集器完成内存清除,销毁那些带有标记的值并收回它们所占用的内存空间。
这中算法是没有循环引用限制的