垃圾回收:
1.标记清除
当变量进入环境(作用域)时,就将该变量记录为"进入环境",当变量离开环境时,记录为"离开环境".垃圾收集器运行时,会给在内存中的所有变量都加上标记。它会去掉环境中的变量以及被引用的变量的标记。剩下的就是要被回收的,原因是环境中的变量已经无法访问这些变量了,最后垃圾收集器会销毁这些带标记的变量。
2.引用计数(不常见)
当声明一个变量A并将一个引用类型值C赋给该变量时,该值的引用计数加1,又将该值赋值给另一个变量B,则又加1.但是当变量A的值改变,即A获取到其他值,则C的计数减一,当为0时,则说明无法访问到该值了,这时就会回收。
引用计数会造成循环引用的问题,循环引用指的是对象A中包含一个指向对象B的指针,对象B也包含一个指向对象A的引用。
function problem () {
var objA = new Object();
var objB = new Object();
objA.one = objB;
objB.two = objA;
}
为了避免循环引用的问题,最好是在不使用它们时,将其值置为null,这种做法叫解除引用,解除引用,不等于垃圾回收了,只是让值脱离执行环境,以便垃圾回收器下次运行时进行回收。垃圾回收器不是立刻执行的,而是周期性运行的。
评论列表
已有0条评论