JS复习之垃圾回收机制

125 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

内存泄漏

在了解垃圾回收机制之前我们先了解下内存泄漏

在进程执行过程中,会不断释放内存来保持性能,但是当一块内存既不使用,又不能释放掉,就被称为内存泄漏

原因:

造成内存泄露的情况有很多,主要有:

  1. 没有及时回收的全局变量
  2. 没有及时处理的闭包
  3. 未及时清除掉的定时器
  4. 没有清理的DOM元素引用

处理内存泄漏的方式可以用js垃圾回收机制处理

垃圾回收机制:

垃圾回收机制(Garbage Collection)简称GC,在JavaScript代码运行过程中会产生一定的垃圾,如果不能周期性,及时性的清除会影响程序运行。通过自动的垃圾回收机制,利用一些回收算法,找可以出不再使用的属性或者引用的变量,由JS引擎可以按照固定时间间隔进行周期性的释放其所占的内存空间,这个机制即为垃圾回收机制

方式:

垃圾回收机制主要有两种方式: 标记清除法、引用计数法

标记清除:

在变量执行时,会遍历所有的变量,然后变量执行完毕后会找到那些未做到标记的变量进行删除,再进行下一次循环

优点:

  1. 实现简单
  2. 能够回收循环引用的对象
  3. 普遍性高,大多数浏览器都采用这种方式

缺点:

  1. 标记效率低,大量占用js执行时间
  2. 会造成碎片化空间,造成空间的浪费
  3. 不能立即回收垃圾

引用计数:

每个变量被声明时,用计数器监听它的引用对象,在它的引用对象在引用和删除时进行赋值更新计数,引用时加1,删除或指向其他引用对象时减1,当计数为0时进行回收

优点:

  1. 可以立即回收垃圾
  2. 不占用js执行时间
  3. 减少程序执行暂停

缺点:

  1. 无法回收循环引用的对象
  2. 需要引用计数,且时刻监视引用数值是否有变化,所以时间开销大
  3. 操作繁琐
  4. 计数器占位
  5. 计数器需要增减处理任务繁重