js垃圾回收

概述
自动垃圾回收机制就是找出那些不再继续使用的值,然后释放其占用的内存空间。垃圾回收器每隔固定的时间段就执行一次释放操作。
js最常用的是通过标记清除的算法来找到哪些对象是不再继续使用的
在局部作用域中,当函数执行完毕的时候,局部变量也就没有存在的必要了,因此垃圾回收器很容易做出判断并回收。
但是全局变量什么时候需要自动释放内存空间则很难判断,因此在开发中,需要尽量避免使用全局变量。
js的内存管理是自动执行的,是不可见的
变量的生命周期
当一个变量的生命周期结束之后它所指向的内存就应该被释放。JS有两种变量,全局变量和在函数中产生的局部变量。局部变量的生命周期在函数执行过后就结束了,此时便可将它引用的内存释放(即垃圾回收),但全局变量生命周期会持续到浏览器关闭页面。

var a=20;//在内存中给数值变量分配空间
alert(a+100);//使用内存
a=null;//使用完毕后,释放内存空间

检测垃圾的方法
(1)标记清除法
不能释放“进入环境”的变量所占的内存,只要执行流进入相应的环境,就有可能用到他们。而当变量离开环境的时候,则将其标记为“离开环境”。
进行标记的方式有很多种:翻转某个特殊位来来记录一个变量何时进入环境;使用一个“进入环境”变量列表和一个“离开环境”列表;
垃圾回收器在运行的时候会给所有变量都加上标记,然后,环境中的变量以及环境中的变量引用的变量,他们身上的标记会被去掉。
而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。
最后,垃圾收集器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间。

function test(){ 
 var a = 10 ; //被标记 ,进入环境 
 var b = 20 ; //被标记 ,进入环境 
} 

test(); //执行完毕 之后 a、b又被标离开环境,被回收。

(2)引用计数法(跟踪记录每个值被引用的次数。)
当声明了一个变量,并将一个引用类型值赋值给该变量时,则这个值的引用次数就是1。
如果同一个值又被赋给另外一个变量,则该值得引用次数加1。
相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数减 1。
当这个值的引用次数变成 0时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。
这样,当垃圾收集器下次再运行时,它就会释放那 些引用次数为零的值所占用的内存。

但是很重要的一点是当遇到循环引用的时候,函数的引用次数就不会为0,所以不会被垃圾回收器回收内存,会造成内存泄露。在IE中涉及COM对象,就会存在循环引用的问题。

function test(){ 
     var a = {} ; //a的引用次数为0 
     var b = a ; //a的引用次数加1,为1 
     var c =a; //a的引用次数再加1,为2 
     var b ={}; //a的引用次数减1,为1  
}

 

posted @ 2020-12-14 22:13  laowang666888  阅读(113)  评论(0编辑  收藏  举报