# 垃圾收集的背景

    Javascript具有自动垃圾收集机制,也就是说,执行完井会自己负责管理代码执行过程中使用的内存;而早C和C++之类的语言中,垃圾回收机制是需要开发人员手工跟踪内存的使用情况,这也是,造成内存泄漏的一个根源。

    垃圾收集器必须跟踪那个变量有用哪个变量没用,对于不再有用的变量打上标记,以备将来收回其占用的内存。用于标识无用变量的策略可能会因实现而异,但具体到浏览器中的实现,则通常有以下两个策略。

# 策略① —— 标记清除

    最常用的垃圾收集方式是标记清除,当变量进入环境时,将这个变量标记为进入环境,当变量被用完,离开环境时,标记为离开环境

    垃圾收集器在运行的时候会给存储在内存中的所有变量都加上标记。然后它会去掉环境中的变量以及被环境中的变量引用的变量的标记。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。最后,垃圾收集器完成内存清除工作,销毁哪些带标记的值,并回收它们所占用的内存空间

# 策略② —— 引用计数

    另一种不太常见的垃圾收集策略叫引用计数。引用计数的含义是跟踪记录每个值被引用的次数,当声明了一个变量并被赋值了引用类型的值,则这个值的引用次数就是1,与此同时如果再被赋予变量的话,则引用次数加1。相反如果包含对这个的引用的变量,又取得了另外一个新,则这个值得引用次数减1,当减到0的时候,就会释放这个值所占用的内存

弊端:循环引用问题和IE9以前的浏览器都会到这引用计数的算法有问题。

# 管理内存

    最主要的一个问题,就是分配给Web浏览器可用内存数量通常要比分配给桌面应用程序。这样做的目的主要是由于安全方面的考虑。目的是防止JS的网页耗尽全部系统内存而导致系统崩溃。内存限制问题不仅会影响给变量分配内存,还会影响调用栈以及在一个线程中能够同时执行的语句数量. 一般通过将其值设置为null来释放其引用——解除引用

    不过,解除一个值得引用并不意味着自动回收该值所占用的内存,解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行将其回收。

# 总结

  • 离开作用域的值将被自动标记为可以回收,因为将在垃圾收集器件被删除。
  • 标记清除是目前主流的垃圾收集算法,这种算法的思想是给当前不使用的值标记,然后再回收其内存
  • 另一种垃圾手机算法是引用计数,这种算法的思想是跟踪记录所有值被引用的次数,JavaScript引擎目前都不再使用这种算法;但在IE中访问非原生JavaScript对象(DOM元素)时,这种算法仍然可能会导致问题。
  • 当代码中存在循环引用现象时,"引用计数"算法就会导致问题。



-- 本篇博客来自于《JavaScript》高级程序设计(第三版)4.3章节