Javascript 中的内存管理

无论哪种语言,内存的生命周期差不多总是相同的:

  1. 分配你需要的内存

  2. 使用它(读、写)

  3. 当不再需要已分配的内存时释放它

js 中,大部分内存管理问题出现在释放内存阶段1,基本问题在于无法确定一些内存是否“不再被需要”。高阶语言的的解释器包含一个称为“垃圾收集器”的软件,它的工作是追踪内存的分配使用,以便在于不再需要某个已分配的内存时发现,并自动释放它。

垃圾回收算法:

  1. 引用计数式

    引发内存泄漏的主要方式:循环引用、内部函数引用(闭包)、页面交叉泄漏、貌似泄漏

    1
    2
    3
    4
    5
    6
    7
    8
    9
    function f() {
    var o = {};
    var o2 = {};
    o.a = o2;
    o2.a = o;
    return 'jimco';
    }
    f();
  2. 标记 - 扫描式

    这个算法将定义“一个对象不再被需要”,缩小为“一个对象不能被到达”。算法假设一组称为 root 的对象(在 js 中,root 是全局对象)。垃圾收集器会定期地从 root 开始查找所有被 root 引用的对象,然后是所有被这些对象引用的对象,以此类推。由于是从 root 开始,因此垃圾收集器将找到所有可以到达的对象,并收集所有不可到达的对象。

参考资料: