JS垃圾收集机制原理

1、原理:

找出那些不再继续使用的变量,然后释放其占用的内存,垃圾收集器会按照固定的时间间隔,或是在代码执行中预订的收集时间,去周期性的执行这个操作,完成垃圾的清理。

2 、局部变量的生命周期

在函数执行的过程中,才存在有局部变量,在这个过程中,浏览器引擎会为局部变量在栈或是堆内存上分配相应的空间,以便存储这些值。在函数执行结束后,局部变量就没有存在的必要了,因此可以释放它们所占用的内存以供将来使用。这种情况下会比较好判断变量有没有必要存在了,但是作用域还没有结束,当前变量还被其他地方调用了,那么垃圾收集器就得跟踪这些变量哪个有用哪个没用,做上相应的标记。

3 、垃圾清理实现策略一:标记清除

当变量进入环境时,如在函数中var一个变量,此时将这个变量标记为进入环境,当变量离开环境的时候,则将其标记为离开环境,可以通过翻转某一个位来标记一个变量何时进入了环境。但标记不是重点,重点是标记了之后怎么来将其处理。垃圾收集器会在运行的时候给存储在内存中的所有变量都加上标记,然后,它会去掉环境中的变量以及被环境中的变量应用的标记,在此之后再把加上标记的变量都将被视为准备删除的变量。最后,垃圾收集器完成内存的清楚工作,销毁那些带标记的值并收回它们所占用的内存空间

4 、垃圾清理实现策略二:引用计数

跟踪记录每个值被引用的次数,当这个值的引用次数变成0的时候,说明没有办法再访问这个这个值,就将其占用的内存空间收回来,下次再运行垃圾收集器的时候,就会释放哪些引用次数为0的值所占用的内存了。

但存在的一个问题是,如果有循环引用,即A有个指针指向B,B也有一个指针指向A,在采用标记清楚策略的实现中,这将是个噩梦。如果DOM元素和原生JS对象之间创建了循环引用,那就带来内存泄露的问题,解决方法是把DOM和BOM对象转换成真正的JS对象。

5 、垃圾收集的时间间隔

原来IE的垃圾收集器的启动方式是,当内存分配量达到256个变量、4096个对象字面量和数组元素或是64kb的字符串这三者任何一个临界值时,就开始启动垃圾收集器。但一个脚本中可能会在其生命周期中一直保有那么多变量,那么垃圾收集器就得一直的去运行,那导致的性能问题是很严重的。所以后面的优化方法是:触发垃圾收集的变量分配的临界值被调整为动态修正

JS是一门具有自动垃圾收集机制的编程语言,开发人员不必担心内存分配和回收的问题,对其垃圾收集例程总结如下:

#离开作用域的值将被自动标记为可以回收,因此在垃圾收集期间被删除

#"标记清除"是目前主流的垃圾收集算法,其思想是给当前不使用的值加上标记,然后再回收其内存

#另一种收集算法是“引用计数”,其思想是跟踪记录所有值被引用的次数,JS引擎目前都不在使用该算法,但在IE中访问非原生JS对象(如DOM元素)时,这种算法仍然可能会导致问题,当代码中存在循环引用现象时亦会导致问题

#解除变量的引用不仅有助于消除循环引用现象,而且对垃圾收集也有好处,为了确保有效地回收内存,应该及时解除不再使用的全局对象、全局对象属性以及循环变量的引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值