JS垃圾回收机制

JavaScript通过自动内存管理来实现内存分配和闲置资源回收。基本思路:确定哪个变量不会再使用,然后释放它所占用的内存。这个过程是周期性的,即垃圾回收程序每隔一定的时间(或者说在代码执行过程中某个预定的收集时间)就会自动运行。

⚠️  垃圾回收过程是一个近似且不完美的方案,因为某块内存是否还有用,属于“不可判定问题”,意味着无法靠算法解决。

垃圾回收程序会跟踪记录哪个变量还会使用,哪些变量不会再使用,以便回收内存。浏览器用到过的两种主要标记变量的策略为:标记清理引用计数

1.标记清理

标记清理的思路为:当变量进入上下文时,会被加上存在于上下文中的标记。而在上下文中的变量,逻辑上讲,永远不应该释放它们的内存,因为只要上下文中的代码在运行,就有可能用到它们。当变量离开上下文时,也会被加上离开上下文的标记。

垃圾回收程序在运行时,会标记内存中存储的所有变量。然后,它会将所有在上下文中的变量,以及被上下文中的变量引用的变量的标记去掉。在此之后其余加上标记的变量就是待删除变量,因为任何上下文中的变量都访问不到它们了。随后垃圾回收程序做一次内存清理,销毁带标记的所有值并回收它们的内存

⚠️  给变量加标记有很多方式,不做赘述

2.引用计数

引用计数的思路为:对每个值都记录它被引用的次数。声明变量并给它赋一个引用值时,这个值的引用数为1。如果同一个值又被赋值给另一个变量,那么引用数➕1。类似的,如果保存对该值引用的变量被其他值覆盖了,那么引用值➖1,当一个值的引用数为0时,就说明没办法访问到了。垃圾回收程序下次运行时,就会释放引用数为0的值的内存。

⚠️  引用计数有很严重的问题:循环引用,所以一般不采用引用计数法。


说明:以上内容为读《Javascript高级程序设计》4.3垃圾回收 的摘录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值