JavaScript具有自动垃圾回收机制,垃圾回收机制会按照固定的时间间隔周期性地执行这一操作,垃圾回收机制必须跟踪哪个变量有用哪个变量没用,对于不再有用的打上标记,以备将来回收内存,用于标记无用变量的策略因实现而异,具体到浏览器中的实现,以下两种最为常用.
标记清除
这是JavaScript中最常用的垃圾收集方式
- 运行时:垃圾收集器给内存中的所有变量都加上标记
- 去掉环境中的变量以及被环境中的变量引用的变量的标记
- 之后再被加上标记的变量则被视为准备删除的变量
- 垃圾收集器销毁带有标记的值并回收所占用的内存空间
引用计数
顾名思义该方法就是记录每个被引用的次数,声明一个变量,将一个值赋值给这个变量,则该值的引用次数为1,同一个值又被赋给另一个变量,引用次数加1,相反这个变量取了另外一个值,则引用次数减1,当引用次数变为0时,则没有办法再访问这个值,垃圾收集器下次运行碰到引用次数为0 的值,所占内存就会被回收.
- 循环引用:引用计数最大的问题就是循环引用导致内存无法回收
- 虽然为了避免这个问题,现在基本都采用标记清除的方式,但是IE中有一部分对象不是原生JavaScript对象,例如BOM,DOM中的对象就是以COM对象的形式实现的,而COM采用的是引用计数的垃圾回收机制.所以还是会碰到这个问题.为了避免可以在不使用时收到断开原生JavaScript对象与DOM对象的连接.
解除引用
为了让性能更佳,一旦数据不再使用,最好通过将值设置为null来释放其引用,这个方法法叫做解除引用.
function sum(a,b){
return a+b;
}
let result = sum(1,2);
//执行相应操作
//解除result的引用
result = null;
网友评论