浏览器的垃圾回收机制

文章介绍了JavaScript中的两种主要垃圾回收机制:标记清除和引用计数。标记清除能处理循环引用,但有性能影响,现代浏览器多采用优化策略。引用计数简单实时,但无法解决某些循环引用问题。垃圾回收可能导致短暂的页面卡顿,优化方法包括正确处理数组、对象和函数。
摘要由CSDN通过智能技术生成

浏览器的垃圾回收机制是指在JavaScript中自动管理内存的一种机制。它的主要目标是识别和回收不再使用的对象,以释放内存并防止内存泄漏。

一、标记-清除(Mark and Sweep)算法:

  1. 标记阶段(Mark):从根对象开始(根对象可以是全局对象、活动函数栈等),遍历内存中的对象,并给所有可达的对象打上标记。可达对象指的是能够从根对象出发直接或间接访问到的对象。未被标记的对象则被视为不可达,即被判定为垃圾。

  2. 清除阶段(Sweep):遍历整个堆内存,将未被标记的对象进行回收,并释放其占用的内存空间。这些未被标记的对象被认为是不再被程序所使用的垃圾对象。

 特点:

        优点:可以回收循环引用的对象。循环引用指的是两个或多个对象之间形成相互引用关系,导致它们无法被访问到且无法被正常释放。标记清除法通过标记阶段能够找到被循环引用的对象,并在清除阶段判断它们是否可达,进而将其清除。

       缺点:a.它需要遍历整个堆内存,这会对性能产生一定的影响。b.标记清除法在进行垃圾回收时,需要挂起JavaScript执行线程,可能会引起一些额外的延迟。

       优化:为了减少标记清除法的性能影响,现代浏览器通常采用增量标记和增量式回收等优化措施。增量标记将标记过程分解为多个阶段,与JavaScript事件循环交替执行,减少了单次标记所需的时间。增量式回收则将垃圾回收过程分解为多个小步骤,与JavaScript执行线程交替运行,降低了垃圾回收对主线程的占用时间,提高了界面的响应性。

二、引用计数(Reference Counting)算法:

  1. 每个对象都会有一个引用计数器,用于记录当前对象被引用的次数。

  2. 当对象被引用时,其引用计数器加1;当对象引用被移除或销毁时,计数器减1。

  3. 当对象的引用计数器为0时,即没有任何引用指向它时,该对象被判定为不再被使用,可以回收。

特点:

       优点:简单、实时性较高,能够迅速回收不再被使用的对象。它能够处理循环引用的情况,因为引用计数会自动更新循环引用对象之间的相互引用次数。

       缺点 :a.无法解决循环引用链上的所有对象都无法访问的问题,即使这些对象不再被程序所使用。b.引用计数法需要对每个对象维护引用计数器,增加了内存开销。c.引用计数法无法处理循环引用链上的内存泄漏,因为循环引用对象之间的引用计数永远不会为0。

                                                                                                                           
注意:

1.现代浏览器大部分用的是标记清除法。
2.当垃圾回收器运行时,它会暂停JavaScript的执行(称为“停止-等待”策略),以便准确地标记和清除不再使用的对象。这可能会导致一小段时间的页面卡顿(性能损耗)。


优化垃圾回收:

1.对数组进行优化: 在清空一个数组时,最简单的方法就是给其赋值为[ ],但是与此同时会创建一个新的空对象,可以将数组的长度设置为0,以此来达到清空数组的目的。
2.对object进行优化: 对象尽量复用,对于不再使用的对象,就将其设置为null,尽快被回收。
3对函数进行优化: 在循环中的函数表达式,如果可以复用,尽量放在函数的外面。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值