无论哪种语言,内存的生命周期差不多总是相同的:
分配你需要的内存
使用它(读、写)
当不再需要已分配的内存时释放它
js 中,大部分内存管理问题出现在释放内存阶段1,基本问题在于无法确定一些内存是否“不再被需要”。高阶语言的的解释器包含一个称为“垃圾收集器”的软件,它的工作是追踪内存的分配使用,以便在于不再需要某个已分配的内存时发现,并自动释放它。
# 垃圾回收算法:
引用计数式
引发内存泄漏的主要方式:循环引用、内部函数引用(闭包)、页面交叉泄漏、貌似泄漏
function f() { var o = {}; var o2 = {}; o.a = o2; o2.a = o; return 'jimco'; } f();
标记 - 扫描式
这个算法将定义“一个对象不再被需要”,缩小为“一个对象不能被到达”。算法假设一组称为 root 的对象(在 js 中,root 是全局对象)。垃圾收集器会定期地从 root 开始查找所有被 root 引用的对象,然后是所有被这些对象引用的对象,以此类推。由于是从 root 开始,因此垃圾收集器将找到所有可以到达的对象,并收集所有不可到达的对象。
参考资料: