• JavaScript 是使用垃圾回收的语言,也就是说执行环境负责在代码执行时管理内存;
  • 通过自动内存管理实现内存分配和闲置资源回收;
    • 基本思路:确定哪个变量不会再使用,然后释放它占用的内存
    • 这个过程是周期性的,即垃圾回收程序每隔一定时间,就会自动运行
  • 两种主要的标记策略:标记清理引用计数

标记清理

定义

当变量进入上下文,比如在函数内部声明一个变量时,这个变量会被加上存在于上下文中的标记;当变量离开上下文时,也会被加上离开上下文的标记。

标记方式

  • 当变量进入上下文时,反转某一位
  • 维护“在上下文中”和“不在上下文中”两个变量列表,可以把变量从一个列表转移到另一个列表

引用计数

设计思路

  • 对每个值都记录它被引用的次数;
  • 声明变量并给它赋一个引用值时,这个值的引用数为 1;
  • 如果同一个值又被赋给另一个变量,那么引用数加 1;
  • 如果保存对该值引用的变量被其他值给覆盖了,那么引用数减 1;
  • 当一个值的引用数为 0 时,就说明没办法再访问到这个值了,因此可以安全地收回其内存了。

性能

  • 垃圾回收程序会周期性运行,如果内存中分配了很多变量,则可能造成性能损失,因此垃圾回收的时间调度很重要;
  • 无论什么时候开始收集垃圾,都能让它尽快结束工作;
  • 现代垃圾回收程序会基于对 JavaScript 运行时环境的探测来决定何时运行;
  • 在 IE 中,window.CollectGarbage()方法会立即触发垃圾回收
  • 在Opera 7 及更高版本中,调用 window.opera.collect()也会启动垃圾回收程序

内存管理

  • 将内存占用量保持在一个较小的值可以让页面性能更好;
  • 优化内存占用的最佳手段就是保证在执行代码时只保存必要的数据
  • 解除引用:如果数据不再必要,那么把它设置为 null,从而释放其引用;

通过const和let声明提升性能

let和const是块级作用域,所以相比于使用 var,使用这两个新关键字可能会更早地让垃圾回收程序介入,尽早回收应该回收的内存

隐藏类和删除操作

内存泄漏

静态分配与对象池