js垃圾回收机制和内存泄漏

前端面试之JS垃圾回收机制和内存泄漏 JS垃圾回收机制和内存泄漏 内存泄漏 浏览器封装的V8引擎支持对JS进行解析,当程序运行(runtime)时,只要程序提出需要内存,例如声明赋值字符串、对象、数组等变量时;操作系统就必须给分配内存使用,对于持续运行的服务进程,变量不断增加,并且内存没有得到及时的释放,内存占有会越来越大,轻则影响系统性能,重则直接导致系统崩溃。 不再用到的内存,没有及时释放,就叫做内存泄漏。 有些语言(比如c语言)必须手动释放内存,程序员负责内存管理。 这很麻烦,所以大多数语言提供自动内存管理,减轻程序员的负担,这被称为垃圾 阅读详情

JS环境中分配的内存一般有如下生命周期:

  1. 内存分配:当我们申明变量、函数、对象,并执行的时候,系统会自动为他们分配内存

  2. 内存使用:即读写内存,也就是使用变量、函数等

  3. 内存回收:使用完毕,由垃圾回收机制自动回收不再使用的内存

垃圾回收机制策略
标记清除算法

JavaScript 中最常用的垃圾收集方式是标记清除(mark-and-sweep)。

它的实现原理就是通过判断一个变量是否在执行环境中被引用,来进行标记删除。

垃圾回收器给所有内存变量进行标记,然后去掉执行环境中和被引用的标记,剩余的标记变量是 不会被用到的变量,会被垃圾回收器回收。

这个算法把“对象是否不再需要”简化定义为“对象是否可以获得”。

该算法假定设置一个叫做根(root)的对象(在Javascript里,根是全局对象)。垃圾回收器将定期从根开始(在JS中就是全局对象)扫描内存中的对象。凡是能从根部到达的对象,都是还需要使用的。那些无法由根部出发触及到的对象被标记为不再使用,稍后进行回收。

此算法可以分为两个阶段,一个是标记阶段(mark),一个是清除阶段(sweep)。

  1. 标记阶段,垃圾回收器会从根对象开始遍历。每一个可以从根对象访问到的对象都会被添加一个标识,于是这个对象就被标识为可到达对象。

  2. 清除阶段,垃圾回收器会对堆内存从头到尾进行线性遍历,如果发现有对象没有被标识为可到达对象,那么就将此对象占用的内存回收,并且将原来标记为可到达对象的标识清除,以便进行下一次垃圾回收操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fc2y4K94-1617796650632)(垃圾回收机制.assets/169158136a253bc3)]

在标记阶段,从根对象1可以访问到B,从B又可以访问到E,那么B和E都是可到达对象,同样的道理,F、G、J和K都是可到达对象。

在回收阶段,所有未标记为可到达的对象都会被垃圾回收器回收。

何时开始垃圾回收?

通常来说,在使用标记清除算法时,未引用对象并不会被立即回收。取而代之的做法是,垃圾对象将一直累计到内存耗尽为止。当内存耗尽时,程序将会被挂起,垃圾回收开始执行。

补充: 从2012年起,所有现代浏览器都使用了标记-清除垃圾回收算法。所有对JavaScript垃圾回收算法的改进都是基于标记-清除算法的改进,并没有改进标记-清除算法本身和它对“对象是否不再需要”的简化定义。

标记清除算法缺陷
  • 那些无法从根对象查询到的对象都将被清除

  • 垃圾收集后有可能会造成大量的内存碎片,像上面的图片所示,垃圾收集后内存中存在三个内存碎片,假设一个方格代表1个单位的内存,如果有一个对象需要占用3个内存单位的话,那么就会导致Mutator一直处于暂停状态,而Collector一直在尝试进行垃圾收集,直到Out of Memory。


引用计数算法

这是最初级的垃圾收集算法.现在已经没有浏览器会用这种算法.

此算法把“对象是否不再需要”简化定义为“对象有没有其他对象引用到它”。如果没有引用指向该对象(零引用),对象将被垃圾回收机制回收。

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

引用计数缺陷

该算法有个限制:无法处理循环引用。如果两个对象被创建,并互相引用,形成了一个循环。它们被调用之后会离开函数作用域,所以它们已经没有用了,可以被回收了。然而,引用计数算法考虑到它们互相都有至少一次引用,所以它们不会被回收。

Chrome V8回收算法

参考 Chrome V8回收算法

减少垃圾和回收对性能的影响:

主要注意以下两点:

  • 让垃圾回收尽量少地进行,尤其是全堆垃圾回收。这部分我们基本上帮不了什么忙,主要靠v8自己的优化机制.

  • 避免内存泄露,让内存及时得到释放. 即下面要讲的如何管理内存,避免内存泄漏

如何管理内存

JS 的内存自动管理一个最主要的问题就是分配给 Web 浏览器的可用内存数量通常比分配给桌面应用程 序的少。

避免策略:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:前端)

最后

你要问前端开发难不难,我就得说计算机领域里常说的一句话,这句话就是『难的不会,会的不难』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;当学会这项技术之后,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。

我特地针对初学者整理一套前端学习资料分享给大家,戳这里即可领取

前端路线图

道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。

我特地针对初学者整理一套前端学习资料分享给大家,戳这里即可领取

[外链图片转存中…(img-Q6KkjopZ-1712943220068)]

vue.js的36个技巧

JavaScript 垃圾回收机制和内存泄漏 在 JavaScript 中,事件监听器是常见的内存泄漏来源之一。当你在一个元素上注册了一个事件监听器,但是忘记在不需要监听事件时将其移除,这会导致相关的内存无法被释放。如果你在使用定时器或者异步操作时不适当地管理它们的生命周期,就可能会导致内存泄漏。通过遵循这些最佳实践,开发人员可以减少内存泄漏的风险,确保 JavaScript 应用程序的性能和稳定性。循环引用指的是对象之间形成了一个循环的引用链,导致这些对象无法被垃圾回收器回收。当函数执行完毕后,这两个对象不再被引用,因此它们可以被垃圾回收器清除。 阅读详情

相关推荐

Java实战:绿盾加密文件批量解密工具Ldterm的实现与优化

本文详细介绍了基于Java开发的绿盾加密文件批量解密工具Ldterm的实现与优化过程。通过分析绿盾加密机制,结合Java流处理能力,实现了高效的文件解密方案,并分享了多线程处理、内存优化等性能提升技巧,适用于企业级数据迁移与备份场景。

weixin_29314405的博客 490

JavaScript内存泄露和垃圾回收机制

JavaScript内存泄露、垃圾回收机制

smell201611010513的博客 938

Windows游戏玩家必看:用Process Lasso优化CPU优先级和核心绑定,告别卡顿

本文为Windows游戏玩家详细介绍了如何使用Process Lasso优化系统性能。通过设置CPU优先级和核心绑定,可以智能管理进程资源,确保游戏获得最高调度权限,有效减少因后台程序干扰或Windows调度机制不完善导致的卡顿与帧数波动,从而提升游戏流畅度与稳定性。

weixin_29299807的博客 2217

JavaScript 垃圾回收机制与内存泄漏

一.JavaScript 的垃圾回收机制 JavaScript中最常用的垃圾回收机制是标记清除(mark-and-sweep)。当变量进入环境(例如,在函数中声明一个变量)时,就将这个变量标记为“进入环境”。从逻辑上讲,永远不能释放进入环境的变量所占的内存,因为只要执行流进入相应的环境,就可能用到它们。而当变量离开环境时,这将其标为“离开环境”。 二. 什么是内存泄漏? 当应用程序不再需要占用内存的时候,由于某些原因,内存没有被系统回收 三. 常见的js内存泄漏? 1.全局变量 在浏览器中,全局对象是 wi

nick_zhang的博客 325

ubuntu20.04开机黑屏卡在/dev/sda1:clean,***files,***blocks,解决心得记录

这个问题如果你百度,会发现目前有很多种解决方法。 有更新显卡驱动的,有卸载上一次安装软件的,还有各种奇奇怪怪的故障原因。 如果你是属于上述情况,那么按照百度和论坛的各种指引操作一般都能解决。 但我这里主要说一种特殊情况,就是我什么也没有操作,我什么也没干。就是正常使用系统关了机突然就报错了。 这也是自己亲自遇到的问题,做个小记录方便以后自己回顾。 上一次出现这种情况我重装系统了,这次用了两个月又出现了,重装成本太高,我接受不了,于是找到解决办法。 首先找个终端进入,进入终端的方法很多,用安装u盘

qq_41517017的博客 2万+

转换shp坐标系之前,设置转换的投影

1.点击目录》工具箱》系统工具箱》Data Management Tools.tbx》投影和变换》创建自定义地理(坐标)变换 2.名称自定义 2.输入地理坐标系可以根据所需要转换的shp文件属性中查询出来 把图层拖入arcgis中,右键属性即可查看 3.复制坐标系,点击“输入地理坐标系”右侧的按钮后,粘贴在顶部搜索框中,并按enter键,选择对应的坐标系 4.点击“输出地理坐标系”右侧的按钮后,选择转换后的坐标系,如4326,选择后点击确认按钮。 5.自定义方法中选择

Wangwangwang___的博客 1862

JS内存泄漏与垃圾回收机制你确定了解?

内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。通俗点就是指由于疏忽或者错误造成程序未能释放已经不再使用的内存,不再用到的内存却没有及时释放,从而造成内存上的浪费。

富朝阳的博客 1458

SAP S/4HANA 数据归档的实施方法

实施 SAP S/4HANA 数据归档是一个系统的过程,涉及到策略的定义、技术的执行以及后续的维护和验证。正确的归档策略不仅能优化系统性能,还能帮助企业降低运营成本,确保数据安全,并符合相关法律法规的要求。通过以上案例,我们可以看到不同行业如何依据自己的业务需求和法规要求,利用 SAP S/4HANA 的强大功能来实现数据归档的目标。这些实践证明了数据归档在现代企业信息管理中的重要地位和作用。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 890

JS内存泄漏和垃圾回收机制

程序设计之道无远弗届,御晨风而返。———— 杰佛瑞 · 詹姆士 JS内存泄漏看字面意思是内存泄漏出去,其实不然,内存泄漏是指一块空间使用完没有被销毁一直占用空间,这就是内存泄漏。 常见内存泄漏原因 全局变量引起的内存泄漏。 闭包引起的内存泄漏。 遗忘的DOM引用 垃圾回收机制 通常分为两种方式: 1. 标记清除。 2. 引用计数。 第一种是当变量进入到内存当中...

一入前端深似海 1421

ROS2 多机器人导航仿真入门教程(一)

RMF 是建立在 ROS 2 基础上的一系列可重复使用、可扩展的库和工具,可实现任何类型机器人系统的异构机群的互操作性。RMF 利用标准化的通信协议与部署机器人的基础设施、环境和自动化系统进行通信,以优化关键资源(如机器人、电梯、门、通道等)的使用。它通过资源分配和通过 RMF 核心(将在本书后面详细介绍)防止共享资源冲突,从而为系统增加智能。RMF 灵活而强大,几乎可以在任何通信层上运行,并与任何数量的物联网设备集成。RMF 的架构设计允许随着环境自动化水平的提高而扩展。

2506_90492529的博客 1659

【PPS便携式移动电源】如何透彻了解便携式移动电源,仅需要十分钟阅读即可

PPS 便携式储能电源的发展前景广阔,受益于户外经济爆发、应急备灾需求提升及 “双碳” 政策支持,全球市场规模预计持续增长,2025 年出货量将达 2380 万台,未来将向大功率大容量、光充一体化、智能化方向发展,还会拓展家庭储能、移动医疗等新场景,同时钠离子电池应用、双向逆变技术升级将进一步推动行业发展。

昔时扬尘处 272

面试题——js垃圾回收机制和引起内存泄漏的操作

JS的垃圾回收机制了解吗?        Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。标记“离开环境”的就回收内存。 工作流程: 1.    垃圾回收器,在运行的时候会给存储在内存中的所有变量都加上标记。 2.

yingzizizizizizzz的专栏 2万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

js闭包及垃圾回收机制和引起内存泄漏的操作

js变量作用域的特点和局限 变量的作用域无非就两种:全局变量和局部变量。 javascript语言的特别之处就在于:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。 闭包解决了什么问题? 闭包的概念:“定义在一个函数内部的函数“ 解决的问题:出于种种原因,我们有时候需要获取到函数内部的局部变量。但是,上面已经说过了,正常情况下,这是办不到的!只有通过变通的方法才能实现-那就...

qq_39349116的博客 249

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【前端面经】JS-内存泄漏和垃圾回收机制

如果id为Node的元素从DOM中移除,该定时器仍会存在,同时,因为回调函数中包含对someResource的引用,定时器外面的someResource也不会被释放。并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。然后,它会将所有在上下文中的变量,以及被在上下文中的变量引用的变量的标记去掉。通过设置arr为null,就解除了对数组[1,2,3,4]的引用,引用次数变为 0,就被垃圾回收了。程序的运行需要内存。

欢迎光临~ 261

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

js垃圾回收机制和引起内存泄漏的操作

原因:div中的ul li 得到这个div,会间接引用某个得到的li,那么此时因为div间接引用li,即使li被清空,也还是在内存中,并且只要li不被删除,他的父元素都不会被删除。1. 包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针。从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象。在操作对象时,实际上是在操作对象的引用而不是实际的对象。1. 声明了一个变量并将一个引用类型的值赋值给这个变量,这个引用类型值的引用次数就是1。

dd的博客 772

js垃圾回收机制和引起内存泄漏?

Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。JS中最常见的垃圾回收方式是标记清除。 工作原理:是当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。标记“离开环境”的就回收内存。工作流程: 1.垃圾回收器,在运行的时候会给存储在内存中的所有变量都加上标记。 2.去掉环境中的变量以及被环境中的变量引用的变量的标记。...

高先生的猫 341

JavaScript的垃圾回收机制和常见的内存泄漏

JavaScript的垃圾回收机制和常见的内存泄漏浏览器的垃圾回收机制引用计数法循环引用的限制标记清除法几种常见的内存泄漏小结 有段时间没更新了 这段时间一直在学逻辑性的东西不太好写出来,所以没有更新,(-.-) 今天突然发现了个冷门但是需要知道的东西浏览器的垃圾回收机制 今天我们就来谈一谈 浏览器的垃圾回收机制 (Garbage collection),简称GC,它会周期性运行以释放那些不需要的内存,否则,JavaScript的解释器将会耗尽全部系统内存而导致系统崩溃。 具体到浏览器中的实现,通常有两个策

$狴犴^的博客 676

cookie如何设置或获取,setTimeout和promise的执行顺序,javaScript的事件流模型,navigator对象,js的垃圾回收机制,内存泄漏,location和history

cookie如何设置或获取 <script> //1.设置cookie function setCookie(cname, cvalue, exdays) { var d = new Date() d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000)) var expires = "expires=" + d.toGMTStrin

highfish920的博客 303

js 垃圾回收机制和内存泄漏

垃圾回收机制 这是在前端面试中经常被闻到的题目。 Javascript具有自动垃圾回收机制(GC:Garbage Collecation)。 原理:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。 1. 标记清除法 在函数声明一个变量的时候,就将这个变量标记为“进入环境”。从逻辑上讲,永远都不能释放进入环境的变量作占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其标记为“离开环境”。垃圾回收器在运行时候会给存储在内存中中的所有变量都加上标记。然后它

weixin_51170516的博客 262

详谈JavaScript内存泄漏和底层垃圾回收机制

内存泄漏 定义 我们知道,程序的运行需要操作系统或者运行时提供内存,而对于持续运行的程序,内存会被持续占用,适时地回收当前不执行的程序占用的内存是很重要的,没有及时地回收内存,轻则造成系统性能变差,重则进程崩溃 那么,什么是内存泄漏呢,简单来说,内存中的某个空间被占用,在应当回收的时间没有被回收,就算是内存泄漏了 有些语言需要自己手动去清除占用内存而又没有在执行的程序,而像JavaScript这...

zem 510

JavaScript垃圾回收机制和内存泄漏

JavaScript的垃圾回收机制        Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。 JS中最常见的垃圾回收方式是标记清除、引用计数 。   标记清除 工作原理:是当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。标记“离开环境”的就回收内存。 工作流程: 1.    垃圾回收器,在运行的时候会给存储在内存...

小马过河 218

javascript中的垃圾回收机制和内存泄漏问题(面试高频考点)

问题:请介绍一下 javascript 中的垃圾回收站机制。 回答: javascript 具有自动垃圾回收机制,垃圾收集器会按照固定的时间间隔周期性的执行。javascript 中常见的垃圾回收方式**:标记清除、引用计数**两种方式(一般都使用的是标记清除方式,引用计数方式会出现循环引用的问题)。 标记清除方式: 工作原理:当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。最后标记”离开环境“的就回收内存 工作流程: (1)变量进入上下文,也可理解为作用域,会加

weixin_43120290的博客 1217
上一篇: java毕设项目开源了,springboot+vue的应用级erp系统
下一篇: npm遇到的各种坑(errno)及解决办法
2401_84091663
博客等级 码龄3年 3157粉丝 212原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值