垃圾回收机制

13 篇文章 0 订阅

垃圾回收机制简介:

1.内存的回收只针对局部变量,因为全局变量直至浏览器关闭之前都是存在的.且局部变量在离开执行环境(作用域)时被自动销毁,全局变量和全局对象的属性可以赋给null,随后垃圾收集器下次运行时会检测到,从而释放内存.
2.垃圾收集器是按照一定的时间间隔去检查浏览器内存,然后释放不必要的变量内存.
3.浏览器被分给的内存是有限的,为了考虑性能,无用内存的释放显得格外必要.

变量清除方式

方式1:标记清除

(以chrome浏览器为典型代表,实际上各家浏览器2012年之后均已采用该策略)

标记的方式有很多,简而言之就是不再使用的变量(变量名与变量值之间不再有任何联系)会被做上标记,随后变量值占的内存就会被释放掉.变量值的内存分配

如图所示,对应代码应该是:

function test () {
//a,b,c都是局部变量
var a = 10;
var b = new object();
var c = b;//此时变量b与c指向同一个对象
}

变量值被标记
当垃圾收集器运行时,读到标记然后将变量值占据的内存释放掉.

方式2:引用计数

(以万恶的IE浏览器早期版本为典型,low爆的一种方式,已经被弃用)

当一个值被一个变量引用时.这个值的引用次数就是1,当这个值再次被别的变量引用时引用次数就再加1.当引用该值的变量被赋值给另一个值时,引用次数就自动减1,直至引用次数为0.一般情况下,变量退出执行环境时,值的引用次数会被自行清至0,垃圾收集器检测到,清内存.

注:该方式有一个天大的bug,对循环引用无能为力


垃圾回收机制与闭包的一点关系:

person函数声明时,内存分配如图所示:
这里写图片描述
对应代码:

function person(name) {
    var name = "mark";
    var people1 = function () {
        return name;
    }
    return people1;
}
var people2 = person();
console.log(people2()); //输出mark

当变量退出执行环境时,即person函数不再被调用时:
这里写图片描述
people2的内存不能被释放,就是闭包函数的缺点,当然也可以手动释放

people2 = null;

此时people2不再引用函数对象,等到垃圾收集器下次运行时,就可以释放内存.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值