JavaScript的那些坑之垃圾收集

我也是偶然间被人问到JavaScript的垃圾收集机制时,才想起这个问题确实值得好好的了解一下。

然后我就去查了红书。在红书的78页,第4.3章节,讲述的就是JavaScript的垃圾收集机制。


垃圾收集

JavaScript具有 自动的垃圾收集机制,意思就是当前的执行环境会自动的管理内存:找到那些不会再继续使用的变量,然后释放其占用的内存。
所以,垃圾收集器就要按照固定的事件间隔来施放废变量的内存。

局部变量的生命周期

局部变量只有在函数的执行过程中才存在,在执行过程中,会为局部变量在栈或堆内存上分配相应的空间,以便存储它们的值,然后函数就会使用这些变量直到函数结束。
这个时候,局部变量就没有存在的必要了,它们的内存就要被施放,以便将来使用。
想做到在所有情况下都能不遗漏的收集没有的变量,就需要垃圾收集器必须去跟踪变量,判断每一个变量有用或者没用,然后再给不用的变量打上标记,以备将来收回其占用的内存。

标记清除

最常见的垃圾收集方式就是标记清除。
当变量进入环境(例如,声明变量)时,就将这个变量标记为”进入环境“。而当变量离开环境是,则将其标记为”离开环境“。
现在的主流浏览器内核的JavaScript使用的都是标记清除式的垃圾收集策略,但是他们各自的时间间隔互有不同。

引用计数

另一种不太常见的垃圾收集策略就是引用计数。 
他的含义就是跟踪记录每个值被引用的次数。
当声明变量而且讲一个引用类型的值赋值给变量的时候,这个值的引用次数就是1,如果同一个值又被赋值给另一个变量,则该值的引用次数就加1,
相反,如果包含对这个值引用的另一个变量又取了另一个值,则这个值的的引用次数就减1.
当这个值的引用次数变成0的时候,就说明没办法再访问这个值了。这个值占用的内存回收回来。


管理内存

垃圾收集机制的目的就是确保占用最少的内存可以让页面获得更好的性能。而优化内存占用的最佳方式,就是为执行中的代码值保存必要的数据。
一旦数据不再有用,最好通过将其值设置为null来释放引用----这个做法叫做解除引用。
这个做法就适用大多数的全局变量和全局对象的属性。而局部变量会在它们离开执行环境时自动被解除引用。


不过,解除一个值的引用并不意味着自动回收该值所占用的内存。 解除引用的真正作用是让值脱离执行环境,以便垃圾收集器下次运行时将其回收。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值