js具有自动垃圾回收的机制,开发人员无需手动去触发
常用的垃圾收集方式:
1.标记清除。当变量进入环境,标记为“进入环境”,不能释放进入环境的变量所占用的内存,当变量离开环境是,则将其标记为“离开环境”,当被标记为离开环境,垃圾回收机制会清理这些变量
2.引用计数。跟踪记录每个值被引用的次数,当声明一个变量并将一个引用类型的值赋值给该变量时,则这个值的引用次数就是1,如果同一个值又被赋值给另一个变量,则引用次数就加1,相反如果包含对这个值引用的变量又取得了另一个值,则这个引用次数减1,当引用次数是0,垃圾收集器在运行时候,就会释放引用次数为0的值所占的内存。
如果obj1.x=obj2,obj2.y=obj1,互相引用的对象,引用次数永远是2,导致没法回收
垃圾回收是周期性运行的,IE6垃圾回收机制是变量256个,4096个对象字面量和数组元素,或者64kb的字符串,达到上述任何一个临界值,垃圾收集器会运行,如果一段脚本比较大,垃圾回收机制会频繁运行,IE7重写了垃圾回收机制,临界值更改为动态修改,初始值和IE6一样,如果垃圾收集例程回收的内存分配量低于15%,则临界值会加倍,如果例程回收了85%的内存分配量,则临界值会到默认值
浏览器运行的内存是有限的,内存限制问题不仅影响给变量分配的内存,还会影响调用栈,在一个线程中能够同时执行的语句数量
确保占有少内存会让页面获得更好的性能,优化内存占用的最佳方式:执行中的代码只保存有用的数据,一旦数据不在使用,将其设置为null来释放引用,这个做法叫解除引用(dereferencing)
解除引用并不是自动回收该值占用的内存,解除应用的作用是让其脱离执行环境,让垃圾收集器在下次运行时将其回收
比如闭包中的变量会一直存在内存中,可手动将其设置为null,让垃圾回收机制回收
function A(){
let name='tom'
function B(){
console.log(name)
}
return B
}
let obj = A()
obj()
obj=null//使用完后,将其置为null
垃圾清理是针对对象的,不是针对某个标示符的,不会回收函数声明。函数声明是全局对象windows的一个属性,windows不会被销毁,所以函数声明是不会被销毁的