离开作用域的值将被自动标记为可回收,会在垃圾收集期间被删除。

   “标记清除”是目前主流的垃圾收集算法,这种算法的思想是给当前不使用的值加上标志,然后再回收其内存。

   “引用计数”是另一种的垃圾收集算法,这种算法的思想是跟踪记录所有值被引用的次数。而javascript目前是不使用这种算法。因为当代吗中存在循环引用对象时,“引用计数”算法就会导致问题。  

   我们都知道在C和C++之类的语言中,开发人员的一项基本任务就是手动跟踪内存的使用情况,这是造成许多问题的一个根源。在编写javascript程序时,开发人员不需要关心内存的使用问题,所需内存分配以及无用内存的回收完全实现了自动化管理。这种垃圾收集机制的原理:找出那些不再继续使用的变量,然后释放其占用的内存。为此,垃圾收集器会按照规定的时间间隔周期性的执行这一个操作。

   垃圾收集器是周期性运行的,而且如果为变量分配内存数量很客观,那么回收工作量也必然会很大。IE的垃圾收集器是根据内存分配量运行的,具体一点说就是256个变量、4096个对象(或数组)字面量和数组元素或者64KB的字符串。如果达到了前面说的任何一个临界值的话,垃圾收集器就会运行。但是如果一个脚本中包含很多的变量,那么脚本就会很可能在其生命周期中一直保有那么多的变量,这样一来,垃圾收集器就不得不频繁的运行了。由此引发的严重性问题促使IE7重写了其垃圾收集器的历程。

   对于IE6,IE7的javascript引擎的垃圾收集例程改变了工作方式:触发垃圾收集的变量分配、字面量和数组元素的临界值被调整为动态修正。IE7中的各项临界值在初始时和IE6相同。如果垃圾收集例程回收的内存分配量低于15%,则变量、字面量、数组元素的临界值就会加倍。如果例程回收了85%的内存分配量,则各种临界值重置回默认值。这一看似简单的调整,极大的提升了IE在运行包含大量javascript的页面时的性能。