JavaScript垃圾回收机制理解

191 阅读2分钟

1、垃圾回收机制

js中内存的分配和回收都是自动完成的,内存不使用的时候回被垃圾回收器自动回收。

2、js内存生命周期

js环境中分配的内存一般有三个阶段

  1. 内存分配:声明变量、函数、对象的时候,系统会自动为他们分配内存。
  2. 内存使用:即读写内存,也就是使用变量,函数等。
  3. 内存回收:使用完毕,由垃圾回收机制自动回收不再使用的内存 补充:js全局变量的生命周期与程序挂钩,程序关闭,全局变量自动释放,局部变量(函数内声明的变量)不使用会被自动回收,所以在开发中我们尽量避免声明全局变量,否则会造成内存泄漏。可以将变量赋值为null 手动清除

3、垃圾回收算法

3.1、引用计数法

  1. 跟踪记录每个值被引用的次数
  2. 如果这个值被引用了一次,那么记录次数1
  3. 多次引用会累加
  4. 如果减少一个引用就减1
  5. 如果引用次数是0,则释放内存 弊端:嵌套引用 如果两个对象互相引用,虽然他们已经不再使用,垃圾回收器不回进行回收,导致内存泄漏。

3.2、标记清除

  1. 给所有变量增加一个标记,如果是进入执行环境(比如声明变量),则标记为“进入环境”,如果是结束执行环境(比如执行完相关函数),则标记为“离开环境”

  2. 去掉“进入环境”的变量标记以及被该变量所引用的变量标记(比如闭包)

  3. 还存在标记的变量即是需要被清理的变量。

4、常见的几种引起内存泄漏的情况

  • 全局变量引起的内存泄露
  • 闭包引起的内存泄露:慎用闭包
  • dom清空或删除时,事件未清除导致的内存泄漏
  • 循环引用带来的内存泄露