当前位置:首页 > 科技  > 软件

JavaScript 如何管理内存

来源: 责编: 时间:2024-04-11 09:01:56 96观看
导读内存影响性能。当你的应用程序代码消耗太多内存时,你会得到一个卡顿的应用程序,甚至可能会出现内存耗尽的崩溃。当你在web浏览器中运行一个应用程序时,大部分应用程序内存存储在Javascript堆中,而这个堆位于计算机的RAM内

内存影响性能。当你的应用程序代码消耗太多内存时,你会得到一个卡顿的应用程序,甚至可能会出现内存耗尽的崩溃。aHS28资讯网——每日最新资讯28at.com

当你在web浏览器中运行一个应用程序时,大部分应用程序内存存储在Javascript堆中,而这个堆位于计算机的RAM内。在 Vue 或者 React 应用程序的上下文中,存储在JS堆中的常见对象包括:组件实例、虚拟DOM,以及如果你使用状态管理工具(Vuex、Pinia、Redux、mobx)的话,包含 State、Action 等。aHS28资讯网——每日最新资讯28at.com

当你与一个应用程序进行交互时,JS堆可能会随着时间的推移而增长。你可以通过使用Chrome DevTools进行剖析时观察到这种增长。aHS28资讯网——每日最新资讯28at.com

aHS28资讯网——每日最新资讯28at.com

我在浏览 Medium 首页几秒钟后拍摄了上面的截图。aHS28资讯网——每日最新资讯28at.com

由于内存增长会影响应用程序的性能,因此清除未使用的内存以释放空间非常重要。Javascript引擎回收未使用内存的过程称为垃圾回收(GC)。与某些语言(如C和C++)不同,Javascript引擎会自动进行垃圾回收。aHS28资讯网——每日最新资讯28at.com

让我们从Chrome开始分析。aHS28资讯网——每日最新资讯28at.com

Javascript 与 Major GC 和 Minor GC

Major GC 和 Minor GC

Major GC( 主垃圾回收器 ):主要负责老生代的垃圾回收;aHS28资讯网——每日最新资讯28at.com

Minor GC( 副垃圾回收器 ):主要负责新生代的垃圾回收;aHS28资讯网——每日最新资讯28at.com

在浏览器中能找到他们(Major GC、Minor GC)之间的工作身影:aHS28资讯网——每日最新资讯28at.com

  • JS HEAP SIZE 明显降低的时候,必是Major GC在工作

aHS28资讯网——每日最新资讯28at.com

  • 反观 Minor GC,则没 Major工作这么明显,但是Minor GC工作会比Major频繁得多

aHS28资讯网——每日最新资讯28at.com

Javascript使用 Major GC 和 Minor GC 清理JS堆

打开Chrome开发者工具,并导航到性能(Performance)选项卡,确保选中“内存(Memory)”复选框。aHS28资讯网——每日最新资讯28at.com

aHS28资讯网——每日最新资讯28at.com

这是Chrome分析器生成的配置文件:aHS28资讯网——每日最新资讯28at.com

aHS28资讯网——每日最新资讯28at.com

你可以看到堆的大小会增长和缩小。如果你仔细观察,你会发现堆大小的下降与垃圾回收活动是对应的。"Major GC" 表示正在进行一次主要的垃圾回收。aHS28资讯网——每日最新资讯28at.com

aHS28资讯网——每日最新资讯28at.com

当JS堆大小大幅下降时,你很可能会在任何网站上看到这种模式。事实上,如果你在单页应用程序中切换标签页时,JS堆的大小没有显著减少,但标签页的内容有所不同,这可能是内存泄漏的迹象。aHS28资讯网——每日最新资讯28at.com

在剖析中,你还会看到“Minor GC”帧。aHS28资讯网——每日最新资讯28at.com

这些 Major GC 和 Minor GC 帧向你揭示了一些关于Javascript中垃圾回收的信息。aHS28资讯网——每日最新资讯28at.com

  • 垃圾回收有两种类型:Major GC 和 Minor GC。
  • Minor GC 通常很短暂,而 Major GC 则需要更长的时间。
  • 在“任务”下看到它们作为帧的事实表明它们都在主应用程序线程上运行。
  • 因为它们在主线程上运行,它们会阻塞Javascript执行,因为浏览器只有一个主线程来运行你的Javascript代码。
  • 由于它们阻塞了Javascript执行,过多的GC会影响应用程序的性能。

注意:GC 只有在某些时候会阻塞Javascript执行。它并不是一直阻塞,而是在显示为帧时。我们在Chrome分析器中无法看到这一点,但在Firefox分析器中可以看到。aHS28资讯网——每日最新资讯28at.com

现在让我们来看看Firefox分析器,它也揭示了Major GC和Minor GC之间的差异。aHS28资讯网——每日最新资讯28at.com

Major GC和Minor GC清理JS堆的两个不同部分

我不是Firefox的用户,我之所以将Firefox下载到我的笔记本电脑上,仅仅是因为它的剖析功能。Firefox的剖析器是开源的,并且比Chrome的剖析器有更多的可视化功能。aHS28资讯网——每日最新资讯28at.com

录制一个剖析文件,并导航到“Marker Chart”可视化。Marker Chart本质上是所有不同类型活动的时间轴,包括垃圾回收活动。aHS28资讯网——每日最新资讯28at.com

aHS28资讯网——每日最新资讯28at.com

你可能会注意到的第一件事是,Minor GC 发生频率相当高,而 Major GC 则不是。这是有很好的原因的,因为如前面所述,Minor GC 很短暂,而 Major GC 则需要更长的时间。aHS28资讯网——每日最新资讯28at.com

如果你将鼠标悬停在一个 Minor GC 切片上,你会得到以下描述:aHS28资讯网——每日最新资讯28at.com

aHS28资讯网——每日最新资讯28at.com

因此,除了它们以不同的频率运行外,Major GC 和 Minor GC 还清理JS堆的不同部分。aHS28资讯网——每日最新资讯28at.com

如上所述,Minor GC 清除了所谓的“苗圃集合(nursery collection)”。 如果对象在 Minor GC 中幸存下来,它们就会从 Nursery 移动到“终身(tenured)”堆或“长期(long-lived)”堆上。 因此,Major GC 必定是清除永久堆的对象。aHS28资讯网——每日最新资讯28at.com

Major GC通过一种名为mark—and—sweep的算法来清理永久化的堆,我们稍后将介绍该算法。aHS28资讯网——每日最新资讯28at.com

aHS28资讯网——每日最新资讯28at.com

现在我们知道 JS 堆至少有 2 个组件:aHS28资讯网——每日最新资讯28at.com

  • 一个用于最近分配的对象的苗圃集合(nursery collection)
  • 一个用于长期存在的对象的永久堆。(“终身(tenured)”堆或“长期(long-lived)”堆)

主要GC算法(增量标记和清除)

Marker Chart 最后一行的屏幕截图中还有一个 GCSlide。 嗯,那是什么?aHS28资讯网——每日最新资讯28at.com

如果将鼠标悬停在 Major GC 矩形上,你会看到 Major GC 的描述:aHS28资讯网——每日最新资讯28at.com

aHS28资讯网——每日最新资讯28at.com

整个Major GC花费了580毫秒。然而,正如描述所说,主线程仅在个别切片上被阻塞。因此,最后一行的GCSlide指的是这些阻塞切片。再往下看,你会发现总切片时间是34.4毫秒,因此在Javascript主线程无法执行应用程序代码时,只有34.4毫秒的工作。aHS28资讯网——每日最新资讯28at.com

如果你将鼠标悬停在其中一个GC切片上,你会得到:aHS28资讯网——每日最新资讯28at.com

aHS28资讯网——每日最新资讯28at.com

请注意,两个工具提示都有“标记阶段”和“清除阶段”。这意味着Javascript垃圾回收有两个阶段:标记和清除。这个算法称为标记-清除。请注意,GC切片的描述中提到了“增量垃圾回收的一个切片”。增量GC是实现标记-清除算法的一种方式。aHS28资讯网——每日最新资讯28at.com

标记阶段通过遍历对象图来“标记”所有从根集合(例如全局变量、活动函数调用)可达的对象。然后,清除阶段“扫描”整个堆,收集并释放所有未标记的对象的内存,这些对象被视为不可达,因此是垃圾。aHS28资讯网——每日最新资讯28at.com

aHS28资讯网——每日最新资讯28at.com

增量意味着你在标记阶段以增量方式进行操作,从而最小化主线程被阻塞的时间。aHS28资讯网——每日最新资讯28at.com

Chrome vs. Firefox

当涉及到Javascript中的垃圾回收时,我想提出一些细微差别。aHS28资讯网——每日最新资讯28at.com

Chrome(以及NodeJS)使用V8 Javascript引擎。aHS28资讯网——每日最新资讯28at.com

另一方面,Firefox使用一个名为SpiderMonkey的不同引擎。正是Javascript引擎带来了垃圾回收。V8使用术语“young generation”代替“nursery”,以及“old generation”代替“tenured heap”。然而,V8和SpiderMonkey都使用Minor GC来清理年轻对象和Major GC来清理老对象。aHS28资讯网——每日最新资讯28at.com

两者都实现了增量标记-清除算法用于Major GC。不过,具体的 增量标记-清除算法 在V8和SpiderMonkey之间有所不同。aHS28资讯网——每日最新资讯28at.com

总结一下:aHS28资讯网——每日最新资讯28at.com

aHS28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-82742-0.htmlJavaScript 如何管理内存

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 17个强大的 AI 工具,让你的工作效率翻倍

下一篇: C++中的内存对齐与数据大小探测:解析sizeof与strlen

标签:
  • 热门焦点
  • 分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS网站旨在为全球Office用户提供丰富的高品质原创PPT模板、实用文档、数据图表及个性化定制服务。优点:OfficePLUS是微软官方网站,囊括PPT模板、Word模
  • 得物效率前端微应用推进过程与思考

    得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 虚拟键盘 API 的妙用

    虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 三分钟白话RocketMQ系列—— 如何发送消息

    三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • 一文搞定Java NIO,以及各种奇葩流

    一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 回归OPPO两年,一加赢了销量,输了品牌

    回归OPPO两年,一加赢了销量,输了品牌

    成为OPPO旗下主打性能的先锋品牌后,一加屡创佳绩。今年618期间,一加手机全渠道销量同比增长362%,凭借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
  • 华为举行春季智慧办公新品发布会 首次推出电子墨水屏平板

    华为举行春季智慧办公新品发布会 首次推出电子墨水屏平板

    北京时间2月27日晚,华为在巴塞罗那举行春季智慧办公新品发布会,在海外市场推出之前已经在中国市场上市的笔记本、平板、激光打印机等办公产品,并首次推出搭载
  • 上海举办人工智能大会活动,建设人工智能新高地

    上海举办人工智能大会活动,建设人工智能新高地

    人工智能大会在上海浦江两岸隆重拉开帷幕,人工智能新技术、新产品、新应用、新理念集中亮相。8月30日晚,作为大会的特色活动之一的上海人工智能发展盛典人工
Top