被好友问到这个问题,突然发现自己知之甚少
JavaScript具有自动垃圾收集机制,为此垃圾收集器会按照固定的时间间隔,周期性地执行这一操作。
垃圾收集器有两种方法:标记清除和引用计数
标记清除的简单原理:在运行时给存储在内存中的所有变量都加上标记,然后,它会去掉环境中的变量以及被环境中的变量引用的变量标记。而在此之后再被加上标记的变量会被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量。最后垃圾收集器销毁带有标记的变量和收回它们所占有的内存空间。
引用计数:引用变量,就将该变量的引用次数 +1,若引用该变量的变量再引用别的变量,则该变量的引用次数 -1,垃圾收集器清除引用次数为0的值。
缺点是无法回收循环引用的变量。
IE6声名狼藉的原因是它在256个变量,4096个对象和数组元素或者是64kb的字符串时,垃圾收集器就会运行,
// IE中的下面方法会立即执行垃圾回收
window.CollectGarbage()
管理内存
一旦数据不再有用时,最好通过将其值设置为null来释放其引用 这个方法叫做解除引用。
解除引用并不意味着自动回收该值所占用的内存。解除引用的真正作用时让值脱离执行环境,以便垃圾收集器下次运行时将其回收。