3、js - 垃圾回收机制

news2025/1/31 11:26:31

1、基础概念

(1)js内存的生命周期

-1- 内存分配:当声明变量、函数、对象时,系统会自动分配内存给它们

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

-3- 内存回收:使用完毕,由垃圾回收器自动回收不再使用的内存

(2)垃圾回收机制(Garbage Collection)简称GC

js的垃圾回收机制是一种内存管理技术,对开发者来说,js的垃圾回收机制是自动的、无形的。

我们创建的原始值、对象、函数……这一切都会占用内存,而在js引擎中有一个垃圾回收器在后台执行。

注意:全局变量一般不会回收(关闭页面时回收);一般情况下局部变量的值,不用了,会被自动回收掉。

2、已过时的垃圾收集算法 - 引用计数法

(1)引用计数法原理

主要看当前创建的对象在堆内存中有没有被其他对象引用,如果没有被其他对象引用,那么该对象将被垃圾回收机制回收。

let obj1 = { name: 'test'}; // 创建一个对象,被obj1所引用,计数为1
let obj2 = obj1; // obj2变量是第二个对该对象的引用,计数为2
obj1 = null; // 该对象的原始引用obj1已经没有了,计数为1
obj2 = null; // 此时对象所有引用都没有了,计数为0,垃圾回收机制回收该对象

(2)致命缺点:循环引用

两个对象内的属性相互引用对象,两个对象的引用计数永远大于0,无法回收导致内存泄漏

function func(){
    let obj1 = {};
    let obj2 = {};
    obj1.a = obj2;
    obj2.a = obj1;
    return 1;
}

在2012年以后所有现代浏览器都取消这种算法了,取而代之的是标记清除法。

3、标记清除法(mark-and-sweep)

2012年起,所有现代浏览器都使用了标记清除法

(1)标记清除法原理

它会定期执行以下“垃圾回收”步骤:

例如,对象有如下的结构:

第一步,标记所有的根

下面列出固有的可达值的基本集合, 这些值明显不能被释放
比方说:
->当前执行的函数,它的局部变量和参数。
->当前嵌套调用链上的其他函数、它们的局部变量和参数。
->全局变量。
->(还有一些内部的)
这些值被称作 (roots)

第二步,跟随根的引用标记它们所引用的对象

第三步,……如果还有引用的话,继续标记

最后,通过这个过程没有被标记的对象被认为是不可达的,并且会被删除

关于垃圾回收,js引擎做了许多优化,使垃圾回收运行速度更快,也使得现代浏览器的性能越来越高,并且不会对代码执行引入任何延迟。

(2)垃圾收集机制的一些优化建议

  • 分代收集(Generational collection)—— 对象被分成两组:“新的”和“旧的”。在典型的代码中,许多对象的生命周期都很短:它们出现、完成它们的工作并很快死去,因此在这种情况下跟踪新对象并将其从内存中清除是有意义的。那些长期存活的对象会变得“老旧”,并且被检查的频次也会降低。

  • 增量收集(Incremental collection)—— 如果有许多对象,并且我们试图一次遍历并标记整个对象集,则可能需要一些时间,并在执行过程中带来明显的延迟。因此,引擎将现有的整个对象集拆分为多个部分,然后将这些部分逐一清除。这样就会有很多小型的垃圾收集,而不是一个大型的。这需要它们之间有额外的标记来追踪变化,但是这样会带来许多微小的延迟而不是一个大的延迟。

  • 闲时收集(Idle-time collection)—— 垃圾收集器只会在 CPU 空闲时尝试运行,以减少可能对代码执行的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/572403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时间跟踪工具:Timemator Mac汉化版

Timemator是一款Mac平台上的时间跟踪工具,它可以帮助用户记录和分析日常工作和任务所花费的时间。Timemator提供了多种时间跟踪功能,包括自动跟踪应用程序和文档、手动添加时间记录、设置定时器等,让用户可以轻松记录和管理时间。 活动时间表…

互联网及SaaS行业如何落地体验管理?

3月25日,「体验家XMPlus」携手PMTalk成功举办了以“2023用户体验新趋势与数据增长实践”为主题的线下沙龙。 在本次活动中,有100多位来自不同企业的产品经理前来参与,大家聚集一起互相交流、分享经验。“体验家”的产品总监李若晨先生也进行了…

[RSA议题分析] Aikido Turning EDRs to malicious wipers using 0-day exploits

文章目录 简介议题分析wiperEDRWindows of Opportunity 总结 简介 本篇议题是由SafeBreach实验室的Or Yair带来的,主要通过利用EDR的删除恶意软件的能力和windows软连接与延迟删除文件的能力去制造一个可以在普通户权限下删除任意文件的恶意软件 - Aikido。这本质上…

科技云报道:汽车云,云计算换挡后的下一个“赛点”?

科技云报道原创。 从去年开始,汽车云似乎成为了云计算赛道的“香饽饽”。 尤其是在下半年,无论是阿里、腾讯、华为三大云巨头,还是百度云、京东云、字节云等奋力争夺“第四朵云”的玩家,均已各种形式“刷新”了其汽车云战略。玩…

Revit中窗族的立面出图设置和构件显隐

​  一、窗族的立面出图设置 Revit中,除了平面的出图设置以外还有立面的出图设置。 例如:如何在立面中,使窗户在精细详细程度显示的是窗的全部主体结构而在粗略/中等详细程度下是显示这样的样式呢? 在窗族样板中,打开立面&…

unity uitoolkit学习

使用UI Toolkit Debugger查看元素 1、打开面板 2、找到元素 在UI Builder窗体,别忘了打开Preview再选择元素 3、可以选择不同类型的窗体 4、查看元素的样式 需要注意的是下面的样式会覆盖上面的 5、调试 修改内置控件样式 1、找到PanelSettings>Theme St…

如果STM32/GD32一类的ARM单片机解除读写保护的方法

文章目录 前言一、打开软件二、连接到目标芯片1.连接2.若目标芯片无写包含3. 若存在读写保护 三、解除读写保护的操作:1. 打开Options Bytes对话框2. 操作步骤 四、工具下载链接 前言 有时候啊,使用ST-Link给STM32一类的ARM单片机下载程序的时候&#x…

Fastjson过滤器用法

fastjson git地址:https://github.com/alibaba/fastjson/wiki SimplePropertyPreFilter 用法 用于过滤某个属性 SimplePropertyPreFilter filter new SimplePropertyPreFilter();filter.getExcludes().add("gender");A a new A(1,"zhangsan"…

CSS样式的三种引入方式及优先级

说明:网页开发有三种技术,分别是html、css和js,分别对应页面的结构、表现和动作。css样式引入,是指把对页面的渲染作用到html上,有以下三种方式:行内式、内嵌式和外联式。 第一种:行内式&#…

噶了呀,现在的00后这么卷的吗?

现在的小年轻真的卷得过分了。前段时间我们公司来了个00年的,工作没两年,跳槽到我们公司起薪20K,都快接近我了。 后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天,原来这位小老弟家里…

KDZD自动脱扣型绝缘靴(手套)耐压试验装置支架

一、概述 KDZD自动脱扣型绝缘靴(手套)耐压试验装置支架是根据《DLT 976-2017 带电作业工具、装置和设备预防性试验规程》、《DLT 1476-2015电力安全工器具预防性试验规程》、《GBT 17622-2008带电作业用绝缘手套》、《CB21148 2020足部防护 安全鞋》等相…

VBA学习-循环语句

目录 一、基础知识学习 二、单元格格式 三、循环语句与判断语句 一、基础知识学习 1、对单元格赋值 Sub 赋值()对单元格进行赋值Range("A1").Value 100End Sub 2、多区域赋值 Sub 多个区域赋值() 多区域赋值Range("B1:C2").Value 200 End Sub 3、不…

2023年10月自考本科如何报名,报考流程是怎样的?

自考本科报名条件: 自考本科没有条件与要求,国家规定:凡中华人民共和国公民,不受性别、年龄、民族、种族和已受教育程度的限制,均可参加自学考试。但是,需要注意的是,办理本科毕业证书者&#x…

2023年,真的别裸辞....

作为IT行业的大热岗位——软件测试,只要你付出了,就会有回报。说它作为IT热门岗位之一是完全不虚的。可能很多人回说软件测试是吃青春饭的,但放眼望去,哪个工作不是这样的呢?会有哪家公司愿意养一些闲人呢?…

【TellMeCode】使用VSCODE + ChatGPT辅助分析推测源码

【TellMeCode】使用VSCODE ChatGPT辅助分析推测源码 0x00 功能简介 根据代码上下文相关信息,如工作区文件夹名称,代码所在路径等一系列信息,提供给大模型更多元和尽可能多的信息,利用其自身优势去检索相关的文档和博客&#xf…

WSL 双系统端口映射,网络穿透最新教程

目录 1 进入wsl 1.1 进入root模式 1.2 随便安装个东西 2 打开win的PowerShell 2.1 查看虚拟机的ip地址 2.2 端口映射转发 2.3 验证是否成功 2.4 删除映射端口命令 1 进入wsl 这里使用的是ubuntuLiunx操作系统 打开wsl,搜索即可。 1.1 进入root模式 命令 …

SSM 如何使用 Redis 实现缓存?

SSM 如何使用 Redis 实现缓存? Redis 是一个高性能的非关系型数据库,它支持多种数据结构和多种操作,可以用于缓存、队列、计数器等场景。在 SSM(Spring Spring MVC MyBatis)开发中,Redis 可以用来实现数…

同一个Service类中非事务方法 调用 事务方法,事务失效 解决方法

同一个Service类中非事务方法 调用 事务方法,事务失效 解决方法 在平时开发中,同一个Service类中非事务方法调用事务方法,事务会失效,这里简单解释一下原因: spring采用动态代理机制来实现事务控制,而动态…

开发小程序流程

小程序的诞生,是继微信公众号之后的又一款火爆的 APP,并且小程序的市场需求也是非常大的。在小程序出现后,很多商家都想开发自己的小程序,但是因为不知道怎么开发,所以对此感到迷茫。下面就由爱尚网络科技来为大家介绍…

成功上岸奇安信!这份零基础入门网络安全的学习路线你一定要看,学长带你网络安全从入门到就业!

作为一个实用型技术博主,​由于我之前写了不少网络安全技术相关的文章,不少读者朋友知道我是从事网络安全相关的工作,于是经常有人在后台问我: 现在转行学网络安全是一个正确的选择吗?我刚入门网络安全,该…