您好!欢迎来到爱源码

爱源码

热门搜索: 抖音快手短视频下载   

四个问题说明了浏览器垃圾收集的过程。 [影视源码]

  • 时间:2022-11-01 00:09 编辑: 来源: 阅读:302
  • 扫一扫,手机访问
摘要:四个问题说明了浏览器垃圾收集的过程。 [影视源码]
浏览器垃圾收集一直是前台面试中比较常见的部分,我不太了解。 最近深入学习,想把一篇文章讲清楚。 首先,我们带着这四个问题来了解一下浏览器垃圾收集的过程。后面我们会一一解答:浏览器是如何收集垃圾的?浏览器中不同类型变量的内存什么时候释放?什么会导致内存泄露?如何避免?weakMap weakSet和地图集有什么区别?好了,我们走吧!什么是垃圾数据?生活中,你买了一瓶可乐,喝完之后可乐瓶就成了垃圾,要回收2。 类似地,当我们编写js代码时,我们经常操作数据。 当少量数据不需要时,就是垃圾数据,垃圾数据占用的内存要回收。 变量的生命周期是这样的代码:let dog = new object()let dog . a = new array(1)JavaScript执行这段代码时,会先在全局范围内添加一个dog属性,在堆中创建一个空对象,将这个对象的地址指向dog。 然后创建一个大小为1的数组,并将属性address指向dog.a 此时的内存布局如下图:image If此时,我给A属性赋了另一个对象,代码如下图:dog.a = new Object()复制代码。此时的内存布局:imagea的指向发生变化,堆中的数组对象成为未使用的数据,技术上称为“不可达”数据。 这是需要回收的垃圾数据。 垃圾收集算法可以把这个过程想象成从根部溢出一个巨大的油漆桶。它从一个根节点开始染色可达对象,然后删除未标记的对象。 第一步:在空间中标出可达值。 V8使用可达性算法来判断堆中的对象是否应该被回收。 该算法的思想是:从根节点开始,遍历所有对象。 可以被遍历的对象是可到达的。 未被遍历、不可达的对象 在浏览器环境中,有许多根节点,主要包括这几种:全局变量窗口,其文档DOM树存储在每个iframe的堆栈中的变量...这些根节点不是垃圾,不能回收。 第二步:回收不可达值占用的内存。 所有标记完成后,内存中所有不可达对象被统一清除。 第三步,做记忆排序。 频繁回收对象后,内存中会出现大量不连续的空间,这就是所谓的“内存碎片”。 当内存中出现大量内存碎片时,如果需要分配较大的连续内存,可能会出现内存不足的情况。 所以最后一步就是整理内存。 (但这一步实际上是可选的,因为有些垃圾收集器不会生成内存碎片,比如二级垃圾收集器,我们接下来要详细了解它。 )垃圾什么时候收?当浏览器收集垃圾时,它会暂停JavaScript脚本,等待垃圾收集完成。 对于普通应用来说,这个没问题,但是对于JS游戏和动画一致性要求高的应用,如果暂停时间长,页卡就会慢。 这就是我们要讲的垃圾收集:什么时候收集垃圾,以免长时间停顿。 代收集浏览器将数据分为两种类型,一种是“临时”对象,另一种是“永久”对象。 临时对象:大多数对象在内存中存在的时间很短。 例如,函数内部声明的变量,或者块级范围内的变量。 当函数或代码块结束时,作用域中定义的变量将被销毁。 这种对象很快就会变得无法接近,所以要赶紧收藏。 长期对象:生命周期长的对象,如全局窗口、DOM、Web API等。 这样的物件可以慢慢回收。 这两种对象对应不同的回收策略,所以V8把堆分为新生期和老年期两个区域。临时对象存储在新生代,持久对象存储在老年。 并让二级垃圾收集器和主垃圾收集器分别负责新一代和老一代的垃圾收集。 通过这种方式,可以实现高效的垃圾收集。 一般来说,面试答案这样就够了。 如果想和面试官深入交流,可以继续说两个收垃圾的。 主垃圾收集器负责老一代的垃圾收集,有两个特点:对象占用空间大 该对象具有较长的存活时间。 它使用“标记-清除”算法来执行垃圾收集。 第一,阅卷。 从一组根元素开始,递归遍历这组根元素。 在这个遍历过程中,能够到达的元素称为活动对象,没有到达的元素可以判断为垃圾数据。 然后就是垃圾清理。 Image直接清除标记为垃圾的数据。 重复标记——清理后会产生大量不连续的内存碎片,需要进行内存碎片整理。 图像垃圾收集器负责新一代的垃圾收集,通常只支持1 ~ 8 m的容量。 新生代分为两个区域:一般是物体区,另一半是闲置区。 Image所有新添加的对象都放入对象区,当对象区快满时,会进行一次垃圾清除。 首先标记对象区域中的所有垃圾。 标记后,幸存的对象被复制到空闲区域,并按顺序排列。 镜像回到我们之前留下的问题——二级垃圾收集器没有进行碎片整理。 因为此时自由区是有序的,没有碎片,所以不需要整理。 复制后,对象区域将与空闲区域交换。 将空闲区域中幸存的对象放入对象区域。 这样,垃圾收集就完成了。 因为二级垃圾收集器频繁操作,所以为了执行效率,新创建的区域的空间通常会被设置得相对较小。 一旦检测到空间已满,就执行垃圾收集。 逐代收集,逐代总结,逐代回收手段:将堆分为新生代和老一代,多回收新生代,少回收老一代。 这样就减少了每次需要遍历的对象数量,从而减少了每次垃圾回收的耗时。 增量图像收集如果脚本中有很多对象,引擎会一次性遍历整个对象,这会造成长时间的停顿。 所以引擎把垃圾收集工作分成更小的块,一次解决一部分,反复解决。 这样就解决了停顿时间长的问题。 映像空闲垃圾收集器将仅在CPU空闲时尝试运行,以减少对代码执行的可能影响。 问题一:浏览器如何回收垃圾?从三点回答什么是垃圾,怎么捡,什么时候捡。 什么垃圾不再需要,意味着垃圾全局变量可以随时使用,所以肯定不是垃圾如何拾取(遍历算法)的标记空间中的“可达”值。 -从根节点(Root)开始,遍历所有对象。 -可以被遍历的对象是可到达的。 -没有被遍历的对象。unreachable回收由unreachable值占用的内存。 做记忆排序 前台什么时候收垃圾有其特殊性,收垃圾的时候页卡会比较慢。 代收集、增量收集和空闲时间收集。 问题2:浏览器中不同类型变量的内存是什么时候释放的?Javascritp中的类型:值类型、引用类型 类型在没有引用后被V8自动回收。 如果值类型在闭包中,V8不会恢复它,直到闭包没有引用。 在不关闭的情况下,等待新一代V8切换回收。 问题3:什么会导致内存泄露?如何避免?内存泄漏是指那些你“用不到”(不能访问)的变量,仍然占用内存空间,无法重用。 以Vue为例,通常会有这几种情况:窗口/身体等监控事件等。、未解除绑定到EventBus的事件、未解除绑定到Vuex的$store的事件、观看后未被第三方库创建的unwatch未调用销毁函数的正确处置方法:beforeDestroy、及时销毁DOM/BOM对象绑定的addEventListener和removeEventListener中的事件。 观察者模式$开,$关解决方案 如果组件中使用了计时器,则应该销毁它。 如果在挂载/创建的钩子中使用了第三方库初始化,则相应的销毁 使用弱参考weakMap,weakSet 封闭会导致内存泄漏吗?顺便说一下,在我理解垃圾收集之前,我误解了闭包。 封闭会导致内存泄漏吗?正确答案是否定的。 内存泄漏是指那些你“用不到”(不能访问)的变量,仍然占用内存空间,无法重用。 闭包里的变量是我们需要的变量,不能说是内存泄漏。 这个误会是怎么产生的?由于IE 有一个IE bug。IE在我们使用它之后仍然不能回收闭包中引用的变量。 这是IE的问题,不是封闭。 参考这篇文章面试问题4:4:weak Map weak Set和Map Set有什么区别?在ES6中,我们增加了两个新的数据结构WeakMap和WeakSet,来解决内存泄漏的问题。 其键名引用的所有对象都是弱引用,即垃圾收集机制遍历时不考虑该引用。 只要被引用对象的所有其他引用都被清理干净,垃圾回收机制就会释放该对象占用的内存。 也就是说,一旦不再需要,WeakMap中的键名对象和对应的键值对就会自动消失,而不需要手动删除引用。 更全面的细节可以在这里找到:问题4:细节下Set,Map,WeakSet,WeakMap的区别汇总。现在我们对浏览器的垃圾收集机制有了一个简单的了解。还记得前四个问题吗?浏览器如何收集垃圾?回答:什么是垃圾,怎么收,什么时候收? 浏览器中不同类型变量的内存什么时候释放?回答思路:分为数值型和参考型。 什么会导致内存泄露?如何避免?答:内存泄漏是指你无法“使用”(无法访问)的变量,仍然占用内存空间,无法重用。 weakMap weakSet和地图集有什么区别?答:WeakMap和WeakSet的弱引用解决了内存泄漏的问题。 读三件事。1.如果你觉得这个内容对你挺有帮助的,我想请你帮我做三件小事:2。喜欢就转发吧,有你们的“喜欢和评论”就是我创作的动力。 3.关注微信官方账号“Java斗皇”,不定期参考原创知识。 4.同时可以期待后续文章ing


  • 全部评论(0)
资讯详情页最新发布上方横幅
最新发布的资讯信息
【技术支持|常见问题】1556原创ng8文章搜索页面不齐(2024-05-01 14:43)
【技术支持|常见问题】1502企业站群-多域名跳转-多模板切换(2024-04-09 12:19)
【技术支持|常见问题】1126完美滑屏版视频只能显示10个(2024-03-29 13:37)
【技术支持|常见问题】响应式自适应代码(2024-03-24 14:23)
【技术支持|常见问题】1126完美滑屏版百度未授权使用地图api怎么办(2024-03-15 07:21)
【技术支持|常见问题】如何集成阿里通信短信接口(2024-02-19 21:48)
【技术支持|常见问题】算命网微信支付宝产品名称年份在哪修改?风水姻缘合婚配对_公司起名占卜八字算命算财运查吉凶源码(2024-01-07 12:27)
【域名/主机/服务器|】帝国CMS安装(2023-08-20 11:31)
【技术支持|常见问题】通过HTTPs测试Mozilla DNS {免费源码}(2022-11-04 10:37)
【技术支持|常见问题】别告诉我你没看过邰方这两则有思想的创意广告! (2022-11-04 10:37)

联系我们
Q Q:375457086
Q Q:526665408
电话:0755-84666665
微信:15999668636
联系客服
企业客服1 企业客服2 联系客服
86-755-84666665
手机版
手机版
扫一扫进手机版
返回顶部