垃圾回收与内存泄漏

半导体测试(一) 探针台是一种用于在晶圆上进行配合探针卡进行电路量测的设备,在测试过程中,探针工作站会将探针与晶圆上的每个die进行接触,以进行电性测量。在这个过程中,每个die都被测试以确保它能基本满足器件的特征或设计规格书(Specification),通常包括电压、电流、时序和功能的验证。晶圆是一个圆形的硅片,在这个半导体的基础之上,建立了许多独立的单个的电路;在所有的die都被探测(Probed)之后,晶圆被切割成独立的dice,这就是常说的die saw,所有被标示为失效的die都被报废,。 阅读详情

前端面试大全·JavaScript垃圾回收与内存泄漏

🌟经典真题

🌟什么是内存泄露

🌟JavaScript 中的垃圾回收

🌟标记清除

🌟引用计数

🌟真题解答

🌟总结


🌟经典真题

  • 请介绍一下 JavaScript 中的垃圾回收站机制

🌟什么是内存泄露

程序的运行需要内存。只要程序提出要求,操作系统或者运行时(runtime)就必须供给内存。

对于持续运行的服务进程(daemon),必须及时释放不再用到的内存。否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。

也就是说,不再用到的内存,如果没有及时释放,就叫做内存泄漏(memory leak)。

🌟JavaScript 中的垃圾回收

浏览器的 Javascript 具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存。其原理是:垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。

但是这个过程不是实时的,因为其开销比较大并且 GC 时停止响应其他操作,所以垃圾回收器会按照固定的时间间隔周期性的执行。

不再使用的变量也就是生命周期结束的变量,当然只可能是局部变量,全局变量的生命周期直至浏览器卸载页面才会结束。局部变量只在函数的执行过程中存在,而在这个过程中会为局部变量在栈或堆上分配相应的空间,以存储它们的值,然后在函数中使用这些变量,直至函数结束,而闭包中由于内部函数的原因,外部函数并不能算是结束。

下面是一段示例代码:

function fn1() {
    var obj = {name: 'zhangsan', age: 10};
}
function fn2() {
    var obj = {name:'zhangsan', age: 10};
    return obj;
}

var a = fn1();
var b = fn2();

在上面的代码中,我们首先声明了两个函数,分别叫做 fn1 和 fn2。

当 fn1 被调用时,进入 fn1 的环境,会开辟一块内存存放对象 {name: 'zhangsan', age: 10}。而当调用结束后,出了 fn1 的环境,那么该块内存会被 JavaScript 引擎中的垃圾回收器自动释放;

在 fn2 被调用的过程中,返回的对象被全局变量 b 所指向,所以该块内存并不会被释放。

这里问题就出现了:到底哪个变量是没有用的?

所以垃圾收集器必须跟踪到底哪个变量没用,对于不再有用的变量打上标记,以备将来收回其内存。

用于标记的无用变量的策略可能因实现而有所区别,通常情况下有两种实现方式:标记清除和引用计数。

引用计数不太常用,标记清除较为常用。

🌟标记清除

JavaScript 中最常用的垃圾回收方式就是标记清除。

当变量进入环境时,例如,在函数中声明一个变量,就将这个变量标记为“进入环境”。

从逻辑上讲,永远不能释放进入环境的变量所占用的内存,因为只要执行流进入相应的环境,就可能会用到它们。

而当变量离开环境时,则将其标记为“离开环境”。

function test(){
  var a = 10 ; // 被标记 ,进入环境 
  var b = 20 ; // 被标记 ,进入环境
}
test(); // 执行完毕 之后 a、b 又被标离开环境,被回收。

垃圾回收器在运行的时候会给存储在内存中的所有变量都加上标记(当然,可以使用任何标记方式)。

然后,它会去掉环境中的变量以及被环境中的变量引用的变量的标记(闭包)。而在此之后再被加上标记的变量将被视为准备删除的变量,原因是环境中的变量已经无法访问到这些变量了。

最后,垃圾回收器完成内存清除工作,销毁那些带标记的值并回收它们所占用的内存空间。

到目前为止,IE9+、Firefox、Opera、Chrome、Safari 的 JS 实现使用的都是标记清除的垃圾回收策略或类似的策略,只不过垃圾收集的时间间隔互不相同。

🌟引用计数

引用计数的含义是跟踪记录每个值被引用的次数。

当声明了一个变量并将一个引用类型值赋给该变量时,则这个值的引用次数就是 1。如果同一个值又被赋给另一个变量,则该值的引用次数加 1。

相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引用次数减 1。当这个值的引用次数变成 0 时,则说明没有办法再访问这个值了,因而就可以将其占用的内存空间回收回来。

这样,当垃圾回收器下次再运行时,它就会释放那些引用次数为 0 的值所占用的内存。

function test() {
    var a = {};	// a 指向对象的引用次数为 1
    var b = a;	// a 指向对象的引用次数加 1,为 2
    var c = a;	// a 指向对象的引用次数再加 1,为 3
    var b = {};	// a 指向对象的引用次数减 1,为 2
}

Netscape Navigator3 是最早使用引用计数策略的浏览器,但很快它就遇到一个严重的问题:循环引用。

循环引用指的是对象 A 中包含一个指向对象B的指针,而对象 B 中也包含一个指向对象 A 的引用。

function fn() {
    var a = {};
    var b = {};
    a.pro = b;
    b.pro = a;
}
fn();

以上代码 a 和 b 的引用次数都是 2,fn 执行完毕后,两个对象都已经离开环境,在标记清除方式下是没有问题的,但是在引用计数策略下,因为 a 和 b 的引用次数不为 0,所以不会被垃圾回收器回收内存,如果 fn 函数被大量调用,就会造成内存泄露。在 IE7 与 IE8 上,内存直线上升。

🌟真题解答

  • 请介绍一下 JavaScript 中的垃圾回收站机制

参考答案:

JavaScript 具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行。

JavaScript 常见的垃圾回收方式:标记清除、引用计数方式。

1、标记清除方式:

  • 工作原理:当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“离开环境”。标记“离开环境”的就回收内存。

  • 工作流程:

  • 垃圾回收器,在运行的时候会给存储在内存中的所有变量都加上标记;

  • 去掉环境中的变量以及被环境中的变量引用的变量的标记;

  • 被加上标记的会被视为准备删除的变量;

  • 垃圾回收器完成内存清理工作,销毁那些带标记的值并回收他们所占用的内存空间。

2、引用计数方式:

  • 工作原理:跟踪记录每个值被引用的次数。

  • 工作流程:

  • 声明了一个变量并将一个引用类型的值赋值给这个变量,这个引用类型值的引用次数就是 1;

  • 同一个值又被赋值给另一个变量,这个引用类型值的引用次数加 1;

  • 当包含这个引用类型值的变量又被赋值成另一个值了,那么这个引用类型值的引用次数减 1;

  • 当引用次数变成 0 时,说明没办法访问这个值了;

  • 当垃圾收集器下一次运行时,它就会释放引用次数是 0 的值所占的内存。

🌟总结

本篇文章是关于JavaScript的一道面试题,后续还会持续更新HTML、CSS、JavaScript、Node.js、Vue.js、网络等前端相关面试题。如果文中出现有瑕疵的地方各位通过评论或者私信联系我,我们一起进步,有兴趣的伙伴可以关注订阅: 前端面试题大全  

批处理脚本手动双击可以执行,但计划任务中执行失败 问题现象: 使用批处理脚本从linux端(samba server) 备份一些数据,设置计划任务每天凌晨两点定时备份。 1)、windows系统中映射共享文件夹为S:盘,需要输入共享用户名和密码 2)、脚本中使用xcopy命令复制共享目录中的文件到windows本地目录中。 脚本如下: set Name=%date:~0,4%%date:~5,2%%date:~8,2% chcp 65001 REM chcp防止中文乱码 mkdir "E:\脚本备份\bakscripts%Name%" xco 阅读详情

相关推荐

STM32F407 FSMC并口读取AD7606

先贴一下最终效果图.这个是AD7606并口读取数据一个周期后的数据结果. 原始波形用示波器看是很平滑的. AD7606不知为何就会出现干扰, 我猜测可能是数字信号干扰导致的. 因为干扰的波形很有规律. 这种现象基本上可以排除是程序问题. 应该是干扰或者数字信号干扰,或者是数字和模拟共地导致的.是一个宏,实际上是指向的一个内存地址, 这个内存地址是FSMC指定的地址. 使用FSMC接口, 可免于控制引脚, 直接读取某个地址即可, FSMC会自动产生操作时序. 具体请见FSMC相关知识.

走错路的程序员 5496

JavaScript 垃圾回收与内存泄漏

在 JavaScript 开发中,垃圾回收和内存泄漏是两个重要的概念。垃圾回收机制可以自动管理内存,但如果不了解其原理,很容易导致内存泄漏,进而影响程序性能甚至导致崩溃。

前端小巷子的博客 1274

别再让PyCharm吃光你的C盘!保姆级教程:安全迁移config、plugins和remote sources到D盘

本文提供了一份详细的PyCharm配置与缓存文件迁移指南,帮助开发者将config、plugins和remote sources等占用大量C盘空间的文件安全转移到D盘。通过修改data.properties文件和正确迁移顺序,确保PyCharm功能不受影响,同时释放宝贵的系统盘空间。

weixin_28836989的博客 423

Js 垃圾回收 与 内存泄漏

但 分配内存 和 释放内存 的逻辑在如 C++ 中的底层语言中是明确的,但在JS这种高级语言中,大部分是隐藏的,JS在定义一个变量时,就已经定义好了内存,同时也提供了垃圾回收的机制,自动回收不再使用的内存。本质是程序对一段内存失去了控制权:程序认为一个变量已经没用了,但垃圾回收引擎认为这个变量还在使用 不能释放,从而导致这段内存不能释放。:DOM 元素被移除后,若事件监听器未移除且回调中引用了该元素,元素无法被回收。本质是找到内存中可以释放的变量,进行释放 回收内存。3.垃圾清除,释放/回收内存。

weixin_62971133的博客 378

群晖NAS从入门到精通的所有帖子汇总,只要这一篇就够了

本站陆陆续续的转载、原创帖子也有十几二十篇了,从不同的角度对群晖NAS的各种骚操作都有深入的讲解,虽然很多文章都不是讲的很深入,但是针对小白入门已经是足够了,希望对小白来说是一个入门,群晖NAS的大佬们勿喷,哪里写的不对的,请随时留言西安SEO优化站长一定在第一时间纠正修改。

西安SEO优化网站资源 8万+

海康视觉脚本开发全流程解析

本文详细解析了海康机器视觉平台(VM)中脚本模块的开发全流程。从创建第一个脚本模块入手,深入讲解了输入参数、输出参数与内部变量的定义与区别,并提供了C#脚本编写、公用函数调用、代码结构组织以及编译调试的实用指南。旨在帮助开发者掌握海康视觉脚本开发的核心技巧,高效实现复杂的自定义视觉逻辑处理。

beer8的博客 599

JS垃圾回收与内存泄漏

JS垃圾回收与内存泄漏

qq_43742385的博客 597

【大模型】AI 辅助编程操作实战使用详解

AI 编程实战使用详解

congge 8459

[Lua] 内存泄漏与垃圾回收

转自:https://www.cnblogs.com/lyh916/p/7896072.html 一.内存泄漏的检测 Lua的垃圾回收是自动进行的,但是我们可以collectgarbage方法进行手动回收。collectgarbage方法的第一个参数是字符串,代表操作类型,第二个参数只有某些操作类型有,是该操作所需要的参数。常用的操作类型有: collect:执行一次完整的垃圾回收 cou...

Zzz的专栏 829

笔试题-2023-星宸-数字IC设计【纯净题目版】

4 笔试题-2023-星宸-数字IC设计【纯净题目版】

w0shishabi的博客 1171

UE5实现距离测量功能

UE5实现距离测量功能

专注GIS开发 6264

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

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

nick_zhang的博客 325

silero-vad 训练自己的数据

silero-vad 训练自己的数据

jacke121的专栏 815

你真的搞懂了 Chrome V8 垃圾回收与内存泄漏了吗?

本文深入解析Chrome V8引擎的垃圾回收机制与内存泄漏问题。V8采用分代回收策略,新生代使用Scavenge算法,老生代结合标记-清除和标记-整理算法,并通过增量标记和并发回收优化性能。常见内存泄漏包括意外全局变量、闭包引用、DOM引用和未清理的定时器/事件监听器。检测工具推荐使用Chrome DevTools的Memory面板和性能分析功能。解决方案包括使用严格模式、及时解除引用、WeakMap存储DOM引用等最佳实践。通过理解这些原理和工具,开发者可以有效预防和解决内存泄漏问题,提升应用性能。

u011286604的博客 1163

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

什么是内存泄漏? 程序的运行需要内存,只要程序提出要求,操作系统或者运行就必须供给内存 对于持续运行的服务进程,必须及时释放内存, 不要再用到的内存,没有及时释放,就叫做内存泄漏 有些语言(比如C语言)必须手动释放内存,程序员复责内存管理,这很麻烦,所以大多数语言提供自动内存管理,减轻程序员的负担,这就被称为垃圾回收机制。 js垃圾回收机制的原理 解决内存的泄漏,垃圾回收机制会定期(周...

有问题可关注公众号:前端研究院 后台输入问题回复 361

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【JS】垃圾回收机制与内存泄漏

【JS】垃圾回收机制与内存泄漏

owo_ovo的博客 584

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

浅谈垃圾回收、内存泄漏与闭包

本文解释了垃圾回收、内存泄漏,以及内存泄漏与闭包的关系

qq_40655561的博客 1037

AS3的内存泄漏与垃圾回收

一、内存泄漏 指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费(百度搜的资料)。这段话是什么意思呢?打个比方吧,放牛人与一只牛,放牛人好比程序设计中的引用,牛好比对象。我们通过引用来控制对象,放牛人通过绳子牵着牛,当牛吃完草后应该牵它回家而不是放手让它走失。当我们失去对该对象(某块内存)的控制时就产生了...

iteye_17849的博客 249

Chrome 浏览器垃圾回收机制与内存泄漏分析

通常情况下,垃圾数据回收分为手动回收和自动回收两种策略。 手动回收策略,何时分配内存、何时销毁内存都是由代码控制的。 自动回收策略,产生的垃圾数据是由垃圾回收器来释放的,并不需要手动通过代码来释放。 JavaScript 中调用栈中的数据回收 JavaScript 引擎会通过向下移动 ESP(记录当前执行状态的指针) 来销毁该函数保存在栈中的执行上下文。 JavaScript 堆中的数据回收 在 ...

AK8896的博客 531

Java的内存回收之内存泄漏与垃圾回收

内存泄漏 程序运行过程中会不断地分配内存空间,那些不再使用的内存空间应该即时回收它们,从而保证系统可以再次使用这些内存,如果存在无用的内存没有被回收起来,那就是内存泄漏。 垃圾回收机制 垃圾回收: 1:跟踪并完成每个Java对象,当某个对象处于不可达状态时,回收该对象所占用的内存; 2.清理内存分配、回收过程中产生的内存碎片 实现高效jvm的一个重要方面就是提供高效

伪文艺编程妞 1840

实测Buzz:免费AI编程助手如何平衡资源、成本与功能

AI编程助手正成为提升开发效率的关键工具,其核心原理是通过集成大型语言模型,理解代码语义并提供智能建议。这类工具的技术价值在于将自然语言指令转化为可执行的代码或解决方案,显著降低开发门槛,加速原型构建与问题排查。在实际应用中,开发者常面临功能与成本的权衡:功能强大的方案往往需要复杂的本地部署或高昂的API费用,而轻量级工具又可能在项目级理解与多轮对话上能力不足。针对这一痛点,Buzz AI编程助手通过灵活的API配置策略,支持接入DeepSeek等提供免费额度的模型,有效缓解了API成本焦虑。同时,其客户端

weixin_34218890的博客 503

java内存泄露 垃圾回收_JAVA内存泄漏与垃圾回收简介

本文介绍内存泄漏是什么以及何时运行垃圾收集器。发生内存泄漏的情况是不再使用对象,并且垃圾收集器无法将其从堆中删除-因为仍在引用它们。结果,应用程序消耗了越来越多的资源-最终导致致命的OutOfMemoryError问题(OOM)。内存泄漏导致OOM问题跟JVM堆设置有关,您可以通过设置参数来指定应用程序的初始和最大堆大小:-Xms-Xmx例如:-Xms64m -Xmx512m,表示JVM以64M开...

weixin_42469749的博客 239

js垃圾回收与内存泄漏

js垃圾回收机制 概念: javascript具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中的使用的内存。而在C和C++之类的语言中,开发人员的一项基本任务就是手动跟踪内存的使用情况,这是造成许多问题的一个根源。在编写javascript程序时候,开发人员不用再关心内存使用的问题,所需内存的分配 以及无用的回收完全实现了自动管理。 JavaScript中最...

weixin_30664615的博客 159

【前端知识】内存泄漏与垃圾回收机制 (上)

介绍内存的生命周期,管理及内存泄漏的相关概念,分析内存泄漏可能的原因

xiaobaizaza_Ry的博客 1900

【JavaScript】垃圾回收与内存泄漏

JavaScript的*垃圾回收机制*是一种自动化的内存管理机制,用于检测和回收不再使用的内存资源,以便重新分配给其他需要的部分。JavaScript中的垃圾回收器负责跟踪和管理内存的分配和释放,使开发人员无需手动管理内存。

俊刚的博客 1420
上一篇: 作用域和作用域链
下一篇: DOM 事件的注册和移除
琢鸣
琢鸣 新星创作者: 前端开发技术领域 新星创作者: 前端开发技术领域
博客等级 码龄7年 9626粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琢鸣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值