JS的垃圾回收机制

为什么有垃圾回收机制?

因为字符串、对象、数组没有固定的大小,所有当它们大小已知的时候,才能对他们进行动态内存分配。JS每次创建的时候,解析器都必须分配内存来存储实体,只有像这样动态分配了内存,最终都需要释放这些内存以便他们能够再次被利用,如果有些原因造成内存没释放的话,就会造成内存泄漏。

JS不像C/C++,他有一套自己的垃圾回收机制。JS的解析器可以检测到何时程序不再使用一个对象了,当他确定了一个对象是无用的时候,他就会将这个内存释放掉。

var a="hello world";
var b="world";
var a=b;

这个时候会释放掉“hello world”,释放内存以便在使用
垃圾回收的方法:标记清除法和计数引用法

标记清除法

JS中最常用的就是标记清除法。当变量进入环境的时候(例如,在函数中声明一个变量的时候),就将这个变量标记为“进入环境”。从逻辑上来说,这个变量所占用的内存永远不能释放,因为只要有执行流进入环境的话,就可能会用到它们。而当变量离开环境的时候,则标记为“离开环境”。

可以使用标记清除法来标记变量。比如,可以通过翻转某个特殊的位来记录一个变量何时进入环境,或者用一个“环境变量列表”以及一个“离开环境的变量”来跟踪哪个变量发生了变化

垃圾回收器在运行的时候会给存储在内存中的所有变量都加上标记,然后它会去掉环境中的变量以及被环境中的变量引用的变量标记。而在此之后再被加上标记的变量将被视为准备删除的变量,环境中的变量已经无法访问这个变量了。最后垃圾收集器完成内存除工作,销毁那些带标记的值并回收它们所占用的内存空间。

引用计数(不常见)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值