JS垃圾回收

news2024/11/20 21:23:45

什么是GC

GC就是Garbage Collection,程序工作过程中会产生很多垃圾,这些垃圾是程序不用的内存或者是之前用过了,以后不会再用的内存空间,而GC就是负责回收垃圾的。当然也不是所有的语言都会自带GC,比如Java、Python、Javascript等,也有没有GC的语言,比如C、C++等,那这种就需要我们程序员手动管理内存了,相对比较麻烦。

垃圾回收

我们知道写代码的时候创建一个基本类型、对象、函数。。。都是需要占用内存的,但是我们并不关注这些,因为这是引擎为我们分配的,我们不需要显式手动的去分配内存。
但是,你有没有想过,当我们不再需要某个东西的时候会发生什么?javascript引擎又是如何发现并清理他的?
我们举个例子:

let test={
	name:"islxk"
};
test=[1,2,3,4,5]

如上所示,我们假设它是一个完整的程序代码
我们知道Javascript的引用数据类型是保存在堆内存中的,然后在栈内存中保存一个对堆内存中实际对象的引用,所以,javascript中对引用数据类型的操作都是操作对象的引用而不是实际的对象。
那么上面代码首先我们先声明了一个变量test,他引用了对象{name:'islxk'},接下来我们把这个变量重新赋值了一个数组对象,也就变成了该变量引用了一个数组,那么之前的对象引用关系就没有了,如下图
在这里插入图片描述
没有了引用关系,也就是无用的对象,这个时候假如任他搁置,多了内存就会受不了,需要被清理。
用官方一点的话来说,程序的运行需要内存,只要程序提出要求,操作系统或者运行时就必须提供内存,那么对于持续运行的服务进程,必须要及时释放内存,否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。

垃圾回收策略

在JS内存管理中有一个概念叫做可达性,就是那些以某种方式可访问或者说可用的值,他们被保证存储在内存中,反之不可访问则需要回收。
至于如何回收,其实就是怎样发现这些不可达的对象(垃圾),并给予清理的问题,js垃圾回收机制的原理说白了就是定期找出那些不再用到的内存,然后释放其内存。
你可能会好奇为什么不是实时找出无用内存并释放呢?其实很简单,实时开销太大了

那么怎样找到其中的垃圾呢?这个流程涉及到了一些算法策略,有很多方式,我们简单介绍两个最常见的:

  • 标记清除算法
  • 引用计数算法
    标记清除算法
    标记清除,目前在js引擎里这种算法是最常用的,到目前为止的大多数浏览器的js引擎都在采用标记清除算法,只是各大浏览器厂商还对此算法进行了优化加工,且不同浏览器的js引擎在运行垃圾回收的频率上有所差异。
    就像他的名字一样,此算法分为标记和清除两个阶段,标记阶段即为所有活动对象做上标记,清除阶段则把没有标记(也就是非活动对象)销毁。
    整个标记清除算法大致流程像下面这样:
  • 垃圾收集器在运行时会给内存中的所有变量都加上一个标记,假设内存中所有对象都是垃圾,全标记为0
  • 然后从各个根对象开始遍历,把不是垃圾的节点改为1
  • 清理所有标记为0的垃圾,销毁并回收他们所占用的内存空间
  • 最后,把所有内存中对象标记修改为0,等待下一轮的垃圾回收
    优点:实现简单,打标记无非打和不打两种情况,这使得一位二进制位就可以为其标记,非常简单
    缺点:标记清除算法有一个很大的缺点,就是在清除之后剩余之后,剩余的对象内存位置是不变的,也会导致内存空闲空间是不连续的,出现了内存碎片,并且由于剩余空间内存不是一整块,它是由不通过大小内存组成的内存列表,这就牵扯出了内存分配的问题。
    在这里插入图片描述
    假设我们新建对象分配内存时需要大小为size,由于空间内存是间断的、不连续的,则需要对空闲内存列表进行一次单向遍历找出大于等于size的块才能为其分配。
    在这里插入图片描述

那如何找到合适的块呢?我们可以采取下面三种分配策略

  • First-fit,找到大于等于size的块立即返回
  • Best-fit,遍历整个空闲列表,返回返回大于等于size的最小块
  • Worst-fit,遍历整个空闲列表,找到最大的分块,然后切成两部分,一部分size大小,并将该部分返回
    这三个策略中Worst-fit看起来空间利用率最合理,但是实际上会造成更多的小块,形成内存碎片,所以不推荐使用,对于First-fitBest-fit来说,考虑到分配的速度和效率First-fit是更为明智的选择。

综上所述:标记清除算法或者说策略就有两个很明显的缺点

  • 内存碎片化
  • 分配速度慢

引用计数算法
引用计数,这其实是早先的一种垃圾回收算法,他把对象是否不再需要简化定义为对象有没有其他对象引用到它,如果没有引用指向该对象(零引用),对象将被垃圾回收制回收,目前很少使用这种算法了,因为他的问题很多,不过我们还是需要了解一下
他的策略是跟踪记录每个变量值被使用的次数:

  • 当声明了一个变量并且将一个引用类型赋值给该变量的时候这个值的引用次数就为1
  • 如果同一个值又被赋给另一个变量,那么引用数加1
  • 如果该变量的值被其他的值覆盖了,则引用次数减1
  • 当这个值的引用次数变为0的时候,说明没有变量在使用,这个值没法被访问了,回收空间、垃圾回收器在运行的时候清理掉引用次数为0的值占用的内存

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

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

相关文章

电脑修改用户(User)文件夹名称

情景:Windows 11 的用户名与 C 盘(系统盘)中的文件夹名称不对应(可能是由于重装系统导致的),例如我笔记本中系统用户名是 “fly”,但文件夹名称却是“16490”。 Step 1:打开Administ…

智能图像处理:基于边缘去除和迭代式内容矫正的复杂文档图像校正

本文简要介绍ACM MM 2022录用论文“Marior: Margin Removal and Iterative Content Rectification for Document Dewarping in the Wild”的主要工作。该论文针对现有的矫正方法只能在紧密裁剪的文档图像上获得较为理想的矫正效果这一不足,提出了一个新的矫正方法Ma…

基于webrtc多人音视频的研究(一)

众所周知,WebRTC非常适合点对点(即一对一)的音视频会话。然而,当我们的客户要求超越一对一,即一对多、多对一设置多对多的解决方案或者服务,那么问题就来了:“我们应该采用什么样的架构&#xf…

利用AirTest实现自动安装APK-跳过vivo手机安装验证

利用AirTest实现自动安装APK-跳过vivo手机安装验证 前言 最近在帮测试组看个问题,他们在自动化测试的时候,通过adb install 命令在vivo手机上安装apk的时候出现”外部来源应用,未经vivo安全性和兼容性检测,请谨慎安装“的提示页面…

仅需一行Python代码,为图片上版权!

哈啰,大家好,我是派森酱,一个Python技术爱好者。今天一个朋友跟我吐槽:前段时间,我辛辛苦苦整理的一份XX攻略,分享给自己的一些朋友,结果今天看到有人堂而皇之地拿着这份攻略图片去引流&#xf…

多项目同时进行时,做好进度管理很重要

进行多项目同时进行时,做好进度管理非常重要。最简单的方法是使用项目管理软件,可以帮助你组织和跟踪多项目的进度。 此外,需要定期审核每个项目的进度,并对项目进行必要的调整,以确保每个项目都能按时完成。 1、多项…

1579_AURIX_TC275_MTU中的ECC机理以及各种寄存器实现

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这一夜的信息全是寄存器地址信息,在了解功能的时候都是非关键信息。后续的内容整理中,这部分类似的信息我都会跳过。 在这个系列的MCU中,ECC实现了单bit…

Angular CLI命令详解

Angular CLI自身操作 显示版本 ng version 或 ng v 这条命令除了显示当前的cli的版本号&#xff0c;还显示LOGO&#xff0c;运行环境等内容&#xff1a; 显示帮助 ng --help 或 ng <sub cmd> --help 比如&#xff1a; ng build --help 如果记不住命令&#x…

数据库,计算机网络、操作系统刷题笔记32

数据库&#xff0c;计算机网络、操作系统刷题笔记32 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

BGP-路由反射器、联邦实验(1.11)

目标&#xff1a; 1、首先需要基于该与拓扑图对172.16.0.0/16进行子网划分&#xff1a; 题中一共需要八个网段的环回和一个骨干链路共8个网段&#xff1b; 172.16.0.0 20 骨干 再分为八个&#xff1a; 172.16.0.0 30 172.16.0.4 30 172.16.0.8 30 172.16.0.12 30 172.16.0.…

1、基本数据类型

目录 一、数值类型 1.整数类型 2.浮点数类型 3.复数 4.无穷量&#xff08;Inf&#xff09;和非数值量&#xff08;NaN&#xff09; 二、逻辑类型 一、数值类型 数值类型数据的分类&#xff1a; 注意&#xff1a;在未加说明与特殊定义时&#xff0c;MATLAB对所有数值按照…

如何myabtis使用注解对数据库进行操作呢?

引入&#xff1a; mybatis进行数据查询既可以通过配置xml文件&#xff0c;也可以通过注解&#xff0c;前几篇文章中&#xff0c;我们一直使用的都是通过配置xml文件&#xff0c;对于使用注解并没有详细的解释&#xff0c;只是简单的使用了以下&#xff0c;下面这篇文章&#x…

生命在于学习——信息收集的一些知识(一)

一、checklist 1、域名信息 &#xff08;1&#xff09;备案信息 在线查询&#xff1a; https://beian.miit.gov.cn/#/Integrated/index https://www.tianyancha.com/ http://cha.fute.com/index http://icp.chinaz.com/ 工具查询&#xff1a;无 &#xff08;2&#xff09;企…

事件总线 + 函数计算构建云上最佳事件驱动架构应用

作者 | 史明伟&#xff08;世如&#xff09; 距离阿里云事件总线&#xff08;EventBridge&#xff09;和 Serverless 函数计算&#xff08;Function Compute&#xff0c;FC&#xff09;宣布全面深度集成已经过去一年。站在系统元数据互通&#xff0c;产品深度集成的肩膀上&…

基于springboot+mybatis美术馆预约管理系统设计和实现以及文档报告

基于springbootmybatis美术馆预约管理系统设计和实现以及文档报告 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言…

为什么在Java7中Switch语句支持String而不支持long呢?

目录 Switch语句长啥样&#xff1f; Switch支持字符以及字符串的底层原理 为什么不支持long类型呢&#xff1f; Switch语句长啥样&#xff1f; public static void main(String[] args) {int num 1;switch (num) {case 1:System.out.println("a");break;case 2:S…

ArcGIS基础实验操作100例--实验89创建面要素的Voronoi

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 空间分析篇--实验89 创建面要素的Voronoi 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08…

数组常用方法总结 (4) :slice / splice

slice 不会改变原始数组。返回内容为截取的内容。两个入参 arr.slice(start,end)&#xff0c;start 为截取开始位置&#xff0c;end 为截取停止位置。截取内容不包含 end。如果不传入参 end&#xff0c;则表示由 start 一直截取到数组的结尾。 <template><div class…

uniApp入门(一)

目录 一、项目准备 1.1、创建项目 1.2、创建页面 1.3、运行项目 1.4、pages.json文件的页面配置与全局配置 1.5、rpx单位 二、内置组件 2.1、基础内容 2.2、视图容器 2.2.1、scrollView 2.2.2、swiper 2.3、表单组件 2.4、路由跳转 2.5、配置tabBar导航菜单与ope…

基于微信小程序云开发的通用会议室预约小程序源码,通用会议室预约微信小程序源码

功能介绍 会议室是一个单位或部门的共用资源,但在使用的时候往往会遇到时间冲突、预约困难、不方便协调等问题。目前大部分公司是统一在公司群聊中预约&#xff0c;每次预约时&#xff0c;都需要翻一下聊天记录&#xff0c;了解是否有人预定以及预定时间等。如果冲突则需要找到…