重学JavaScript高阶知识点(三)—— 详解Js中的内存管理

在这里插入图片描述

详解Js中的内存管理

    • 1. 简介
    • 2. 内存生命周期
    • 3. JavaScript 的内存分配
    • 4. 垃圾回收

1. 简介

  • 很多底层语言一般都有底层的内存管理接口,比如 C语言,可以调用对应的API去创建和释放内存空间。
  • 意思是需要手动去创建和释放内存空间,很明显,这不够高级~
  • JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。这个过程叫做**内存回收。**嘿!所以这很高级,但是高级会产生混乱。
    在这里插入图片描述
  • 这意味着,程序可能在我们需要用的时候就已经回收了变量,导致访问不到某个变量,所以就出现了闭包(用于延长变量的生命周期)

2. 内存生命周期

不管什么程序语言,内存生命周期基本是一致的:

  1. 分配你所需要的内存。
  2. 使用分配到的内存(读、写)。
  3. 不需要时将其释放 \ 归还。
  • 所有语言第二步都是明确的。第一和第三步在底层语言中是明确的,但在像 JavaScript 这些高级语言中,大部分都是隐含的,所以我们更要去了解。

3. JavaScript 的内存分配

3.1 值的初始化

  • JavaScript 在定义变量时就完成了内存分配:
// 给数值变量分配内存
let num = 123; 
// 给字符串分配内存
let str = "123"; 
// 给对象及其包含的值分配内存
let obj = {
  a: 1,
  b: null,
}; 
// 给数组及其包含的值分配内存(就像对象一样)
let arr = [1, 'str'];
// 给函数(可调用的对象)分配内存
function fn(a) {
  return a + 2;
} 

3.2 通过函数调用分配内存

  • 函数调用结果是分配对象内存:
// 分配一个 Date 对象
let d = new Date(); 
// 分配一个 DOM 元素
let e = document.createElement("div"); 
  • 有些方法分配新变量或者新对象:
let str = "123";
let str2 = str .substr(0, 1); // str2 是一个新的字符串

在这里插入图片描述

3.3 使用值

  • 使用值的过程实际上是对分配内存进行读取与写入的操作。
  • 读取与写入可能是写入一个变量或者一个对象的属性值,甚至传递函数的参数。

3.4 当内存不再需要使用时释放

  • 大多数内存管理的问题都在这个阶段。在这里最艰难的任务是找到“哪些被分配的内存确实已经不再需要了”。
  • 它往往要求开发人员来确定在程序中哪一块内存不再需要并且释放它。

4. 垃圾回收

  • 如上所述:自动寻找是否一些内存“不再需要”的问题是无法判定的。因此,垃圾回收实现只能有限制的解决一般问题

4.1 引用计数垃圾收集

  • 垃圾回收算法主要依赖于引用的概念。在内存管理的环境中,一个对象如果有访问另一个对象的权限(隐式或者显式),叫做一个对象引用另一个对象。
  • 在这里,“对象”的概念不仅特指 JavaScript 对象,还包括函数作用域(或者全局词法作用域)。
  • 具体我们可以看下面这个例子:
// 两个对象被创建,一个作为另一个的属性被引用,另一个被分配给变量 obj
// 很显然,没有一个可以被垃圾收集
let obj = {
  a: {
    b: 123,
  },
};

// obj2 变量是对obj的引用
let obj2 = obj; 

// 现在,obj 只有一个 obj2 变量的引用了, obj2 的原始引用obj已经没有了
obj = 123; 

// 这里引用的 a 属性是obj2的了
let oa = obj2.a; 

// 虽然最初的对象obj现在已经是零引用了,可以被垃圾回收了
// 但是它的属性 a 的对象还在被 oa 引用,所以还不能回收
obj2 = "123"; 

// a 属性的那个对象现在也是零引用了,所以obj可以被回收了
oa = null;
  • 需要注意的是:循环引用会出问题。
  • 该算法有个限制:无法处理循环引用的事例。
function f() {
  let o = {};
  let o2 = {};
  o.a = o2; // o 引用 o2
  o2.a = o; // o2 引用 o
  return "123";
}
f();
  • 在上面的例子中,两个对象被创建,并互相引用,形成了一个循环。
  • 它们被调用之后会离开函数作用域,所以它们已经没有用了,可以被回收了。
  • 然而,引用计数算法考虑到它们互相都有至少一次引用,所以它们不会被回收。
  • 我们再来看一个示例:
let div;
window.onload = function () {
  div = document.getElementById("myDiv");
  div.cur = div;
  div.data= new Array(10000).join("*");
};
  • myDiv 这个 DOM 元素里的 cur 属性引用了 myDiv,造成了循环引用。
  • 如果该属性没有显示移除或者设为 null,引用计数式垃圾收集器将总是且至少有一个引用,所以引用计数法是无法释放的,会造成内存泄漏。
    在这里插入图片描述

4.2 标记 - 清除算法

  • 这个算法把“对象是否不再需要”简化定义为“对象是否可以获得”。
  • 假定设置一个叫做根(root)的对象(在 Javascript 里,根是全局对象)。
  • 垃圾回收器将定期从根开始,找所有从根开始引用的对象,然后找这些对象引用的对象,从根开始,垃圾回收器将找到所有可以获得的对象和收集所有不能获得的对象。
  • 这个算法比前一个要好,因为“有零引用的对象”总是不可获得的,但是相反却不一定
  • 在上面的示例中,函数调用返回之后,两个对象从全局对象出发无法获取。因此,他们将会被垃圾回收器回收。第二个示例同样,一旦 div 和其事件处理无法从根获取到,他们将会被垃圾回收器回收。
  • 当然,它也有限制:无法从根对象查询到的对象都将被清除。尽管这是一个限制,但实践中我们很少会碰到类似的情况,所以无需太过担心。

1. 希望本文能对大家有所帮助,如有错误,敬请指出
2. 原创不易,还请各位客官动动发财的小手支持一波(关注、评论、点赞、收藏)
3. 拜谢各位!后续将继续奉献优质好文
4. 如果存在疑问,可以私信我(文底有V)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++11】列表初始化、右值引用的详细讲解(上)

前言 在一开始学C之前我们就简单的了解了一下C的发展历史。 相比较而言,C11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率加了许多特性,约140个新特性。使得C…

电商核心技术揭秘55:社群与粉丝经济的结合

相关系列文章 电商技术揭秘相关系列文章合集(1) 电商技术揭秘相关系列文章合集(2) 电商技术揭秘相关系列文章合集(3) 电商技术揭秘四十一:电商平台的营销系统浅析 电商技术揭秘四十二&#…

OpenAI下周发布更新;TikTok将自动标记AIGC;智谱AI亮相2024 ICLR

OpenAI 官宣下周举办直播发布更新 OpenAI 今日凌晨官宣,将在当地时间 5 月 13 日上午十点(北京时间 5 月 14 日凌晨两点)在官网进行直播,届时将演示一些 ChatGPT 和 GPT-4 的更新。 OpenAI CEO Sam Altman 补充表示,届…

【论文润色心得】博士生的福音来啦!

🌟【论文润色心得】博士生的福音来啦!🎓 📚 投稿屡遭拒绝?语言关难过?看这里,我找到了解决之道!👩‍🏫 💡 我的润色经历,从拒稿到接…

springboot整合rabbitmq的不同工作模式理解

前提是已经安装并启动了rabbitmq,并且项目已经引入rabbitmq,完成了配置。 不同模式所需参数不同,生产者可以根据参数不同使用重载的convertAndSend方法。而消费者均是直接监听某个队列。 不同的交换机是实现不同工作模式的关键组件.每种交换…

excel常见图表大全

Excel图表是一种以图形形式呈现数据的工具,它将数字和统计信息转化为直观的视觉元素,如线图、柱状图、饼图等。这些图表可以帮助人们更容易地理解数据的趋势、关系和模式。 使用场景 Excel图表广泛应用于各个领域,包括: 商务分…

鸿蒙开发学习:初探【ArkUI-X】

ArkTS 是华为自研的开发语言。它在TypeScript(简称TS)的基础上,匹配 ArkUI 框架,扩展了声明式 UI 、状态管理等相应的能力,让开发者以更简洁、更自然的方式开发跨端应用。 ArkUI-X 进一步将 ArkUI 扩展到了多个 OS 平台…

【三十一】springboot+easyExcel实现多文件导出压缩包

互相交流入口地址 整体目录: 【一】springboot整合swagger 【二】springboot整合自定义swagger 【三】springboot整合token 【四】springboot整合mybatis-plus 【五】springboot整合mybatis-plus 【六】springboot整合redis 【七】springboot整合AOP实现日志操作 【…

springcloud -nacos实战

一、nacos 功能简介 1.1.什么是Nacos? 官方简介:一个更易于构建云原生应用的动态服务发现(Nacos Discovery )、服务配置(Nacos Config)和服务管理平台。 Nacos的关键特性包括: 服务发现和服务健康监测动态配置服务动态DNS服务服务及其元数…

OpenHarmony 实战开发——如何编译OpenHarmony自带APP

概述 OpenHarmony 的主干代码是开源社区的重要学习资源,对于想进行应用开发和熟悉 OpenHarmony 能力的同学主干代码是非常重要的资源,在主干代码的 applications 目录里聚集了很多原生的应用实现,那么如何编译这些代码就是我们这篇文章的主要…

宝塔面板Java项目部署,五步轻松搞定

当涉及到正规的开发项目时,最终的上线部署是至关重要的一个环节。本文旨在以最简单便捷的方法来教你如何完成项目的部署工作。 1. SSH下载地址 项目完成后需要使用SSH终端进行项目部署,以确保安全的远程访问、和操作远程服务器。 Xshell (支持Windows系…

若依-生成主子表

1. sql语句建表导入到数据库中: -- ---------------------------- -- Table structure for t_ques————主表 -- ----------------------------CREATE TABLE ques (ques_id INT NOT NULL AUTO_INCREMENT COMMENT Id,name VARCHAR(255) NOT NULL COMMENT 测评名称…

第五届电子通讯与人工智能学术会议(ICECAI 2024, 5/31-6/2)

目录 1. 会议官方2. 会议新闻中华人民共和国教育部新闻 3. 出版历史4. 大会简介5. 主办单位与嘉宾主办单位承办单位主讲嘉宾组委会 6. 征稿主题7. 论文出版8. 参会说明 1. 会议官方 2024 5th International Conference on Electronic communication and Artificial Intelligenc…

笨方法自学python(三)-数学计算

数字和数学计算 这章练习里有很多的数学运算符号。我们来看一遍它们都叫什么名字 plus 加号-minus 减号/ slash 斜杠*asterisk 星号% percent 百分号< less-than 小于号greater-than 大于号< less-than-equal 小于等于号 greater-than-equal 大于等于号 print ("I …

算法-排序详解

目录 前言 比较排序 选择排序 插入排序 冒泡排序 归并排序 快速排序 非比较类排序 计数排序 桶排序 基数排序 排序的稳定性 排序算法的题目 前言 计算机的工作之一就是对数据的处理&#xff0c;处理数据有一个常见的操作就是对数据排序&#xff0c;比如新闻系统总…

AJAX前端与后端交互技术知识点以及案例

Promise promise对象用于表示一个异步操作的最终完成&#xff08;或失败&#xff09;及其结果值 好处&#xff1a; 逻辑更清晰了解axios函数内部运作机制成功和失败状态&#xff0c;可以关联对应处理程序能解决回调函数地狱问题 /*** 目标&#xff1a;使用Promise管理异步任…

SQL Server共享功能目录显示灰色无法自行选择

SQL Server共享功能目录显示灰色无法自行调整 一、 将之前安装SQL Server卸载干净 二、 清空注册表 1. 打开注册表&#xff0c;winR&#xff0c;输入regedit 2. 注册表-》编辑-》查找&#xff0c;输入C:\Program Files\Microsoft SQL Server\ 3. 注册表-》编辑-》查找&#x…

Redis 的 SDS 和 C 中字符串相比有什么优势?

C 语言使用了一个长度为 N1 的字符数组来表示长度为 N 的字符串&#xff0c;并且字符数组最后一个元素总是 \0&#xff0c;这种简单的字符串表示方式 不符合 Redis 对字符串在安全性、效率以及功能方面的要求。 C语言的字符串可能有什么问题&#xff1f; 这样简单的数据结构可…

Kubernetes基础理论介绍

前言 随着企业数字化转型的深入&#xff0c;为云而生的云原生架构和思想已被大量企业所接受。容器云、微服务、DevOps、 Serverless 已成为企业落地云原生的关键技术&#xff0c;而 Kubernetes 作为容器云的核心基础和事实标准&#xff0c;已成为当今互联网企业和传统 IT 企业…

Spring Cloud学习笔记(Nacos):基础和项目启动

这是本人学习的总结&#xff0c;主要学习资料如下 - 马士兵教育 1、基础和版本选择2、启动项目2.1、源码启动项目2.2、命令行启动 1、基础和版本选择 Nacos是用于服务发现和注册&#xff0c;是Spring Cloud Alibaba的核心模块。 根据文档&#xff0c;Spring Cloud Alibaba的版…