js堆和栈

news2024/11/30 8:32:39

目录

关键句提取:       

一、认识堆和栈

1、内存操作场景

2、数据结构场景

二、堆和栈的优缺点

1.栈(stack)

2.堆(heap)

3.总结:

三、堆和栈的溢出

四、 传值和传址

五、为什么会有栈内存和堆内存之分?

垃圾回收

标记清理

引用计数

内存分配

JavaScript 内存管理

JavaScript 内存空间分配

关键句提取:       

        与垃圾回收机制有关。为了使程序运行时占用的内存最小。 stack是有结构的,每个区块按照一定次序存放,可以明确知道每个区块的大小; heap是没有结构的,数据可以任意存放。因此,stack的寻址速度要快于heap。每个线程分配一个栈,每个进程分配一个堆,也就是说,stack是线程独占的,heap是线程共用的。回收机制具体方式是...

一、认识堆和栈


        stack  (栈),heap(堆)

        在理解堆与栈这两个概念时,需要放到具体的场景下去理解。一般情况下有两层含义:

        (1)内存操作场景下,堆与栈表示两种内存的管理方式。

        (2)数据结构场景下,堆与栈表示两种常用的数据结构。

1、内存操作场景


        stack的第一种含义是存放数据的一种内存区域。程序运行的时候,需要内存空间存放数据。一般来说,系统会划分出两种不同的内存空间:一种叫做stack(栈),另一种叫做heap(堆)。

        它们的主要区别是:

        stack是有结构的,每个区块按照一定次序存放,可以明确知道每个区块的大小;

        heap是没有结构的,数据可以任意存放。因此,stack的寻址速度要快于heap。

        三个变量和一个对象实例在内存中的存放方式如下:


        从上图可以看到,i、y和cls1都存放在stack,因为它们占用内存空间都是确定的,而且本身也属于局部变量。但是,cls1指向的对象实例存放在heap,因为它的大小不确定。作为一条规则可以记住,所有的对象都存放在heap。

        接下来的问题是,当Method1方法运行结束,会发生什么事?

        回答是整个stack被清空,i、y和cls1这三个变量消失,因为它们是局部变量,区块一旦运行结束,就没必要再存在了。而heap之中的那个对象实例继续存在,直到系统的垃圾清理机制(garbage collector)将这块内存回收。因此,一般来说,内存泄漏都发生在heap,即某些内存空间不再被使用了,却因为种种原因,没有被系统回收。

        栈由操作系统自动分配和释放,比如基本数据类型(Number、String、Boolean……)和函数的参数值等。

        堆由开发人员自主分配和释放,若不主动释放,程序结束时由浏览器回收,用于存储引用类型

2、数据结构场景

👉堆和栈详解js_js堆和栈_前端老实人的博客-CSDN博客

二、堆和栈的优缺点

1.栈(stack)

        栈中的内容是操作系统自动创建、自动回收,占据固定大小的空间,因此内存可以及时得到回收,相对于堆来说,更加容易管理内存空间。

        相比于堆来说存取速度会快,并且栈内存中的数据是可以共享的,例如同时声明了var a = 1和var b =1,会先处理a,然后在栈中查找有没有值为1的地址,如果没有就开辟一个值为1的地址,然后a指向这个地址,当处理b时,因为值为1的地址已经开辟好了,所以b也会同样指向同一个地址。

        相比于堆来说的缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性

2.堆(heap)

        堆是操作系统动态分配的大小不定的内存,因此方便存储和开辟内存空间。

        堆中保存的对象不会自动释放,一般由程序员分配释放,也可由垃圾回收机制回收,因此生存周期比较灵活。

        相比于栈来说的缺点是,存在堆中的数据大小与生存期是不确定的,比较混乱,杂乱无章。

3.总结:


        运行程序的时候,每个线程分配一个栈,每个进程分配一个堆,也就是说,stack是线程独占的,heap是线程共用的。此外,stack创建的时候,大小是确定的,数据超过这个大小,就发生stack overflow错误,而heap的大小是不确定的,需要的话可以不断增加。

        栈存放基本类型的变量、函数、对象变量指针,堆存放对象

        放在栈里面的变量,只要值一样就可以全等,栈占内存较小,会自动释放值,值为null,放在堆里面的变量,值相等(应为会默认转成相同数据类型进行对比),全等=会比较是否引用一个数据故不等,不会自动释放值

        基本数据类型,在当前环境执行结束时销毁,而引用类型只有在引用的它的变量不在时,会被垃圾回收机制回收。

三、堆和栈的溢出


        (1)如果想要堆溢出,比较简单,可以循环创建对象或大的对象;

        (2)如果想要栈溢出,可以递归调用方法,这样随着栈深度的增加,JVM (虚拟机)维持着一条长长的方法调用轨迹,直到内存不够分配,产生栈溢出。

四、 传值和传址

👉堆和栈详解js_js堆和栈_前端老实人的博客-CSDN博客


五、为什么会有栈内存和堆内存之分?


        通常与垃圾回收机制有关。为了使程序运行时占用的内存最小。

        当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;

        当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。

垃圾回收


        JavaScript堆不需要程序代码来显示地释放,因为堆是由自动的垃圾回收来负责的,每种浏览器中的JavaScript解释引擎有不同的自动回收方式,但一个最基本的原则是:如果栈中不存在对堆中某个对象的引用,那么就认为该对象已经不再需要,在垃圾回收时就会清除该对象占用的内存空间。因此,在不需要时应该将对对象的引用释放掉,以利于垃圾回收,这样就可以提高程序的性能。释放对对象的引用最常用的方法就是为其赋值为null

        垃圾回收方面,栈内存变量基本上用完就回收了,而推内存中的变量因为存在很多不确定的引用,只有当所有调用的变量全部销毁之后才能回收。

        局部环境中,函数执行完成后,函数局部环境声明的变量不再需要时,就会被垃圾回收销毁(理想的情况下,闭包会阻止这一过程)。

        全局环境只有页面退出时才会出栈,解除变量引用。所以开发者应尽量避免在全局环境中创建全局变量,如需使用,也要在不需要时手动标记清除,将其内存释放掉。

        垃圾回收机制需要跟踪标记变量,并判定是否使用。如何标记未使用的变量也许有不同的实现方式。但是在浏览器里面的话有两种常用的方式:标记清理和引用计数。

标记清理


        垃圾回收程序运行的时候,会标记内存中存储的所有变量。然后,它会将所有在上下文中的变量,以及被在上下文中的变量引用的变量的标记去掉。在此之后再被加上标记的变量就是待删除的了,原因是任何在上下文中的变量都访问不到它们了。随后垃圾回收程序做一次内存清理,销毁带标记的所有值并收回它们的内存。

引用计数


        思路是对每个值都记录它被引用的次数。声明变量并给它赋一个引用值时,这个值的引用数为1。如果同一个值又被赋给另一个变量,那么引用数加1。类似地,如果保存对该值引用的变量被其他 值给覆盖了,那么引用数减1。当一个值的引用数为0时,就说明没办 法再访问到这个值了,因此可以安全地收回其内存了。垃圾回收程序 下次运行的时候就会释放引用数为0的值的内存。该方法无法解决循环引用问题。如:A引用B,同时B引用A,相互应用。会导致内存泄漏。

总结
        离开作用域的值会被自动标记为可回收,然后在垃圾回收期间被删除。

        主流的垃圾回收算法是标记清理,即先给当前不使用的值加上标记,再回来回收它们的内存。

        引用计数是另一种垃圾回收策略,需要记录值被引用了多少次。

        引用计数在代码中存在循环引用时会出现问题。

        解除变量的引用不仅可以消除循环引用,而且对垃圾回收也有帮助。

        为促进内存回收,全局对象、全局对象的属性和循环引用都应该在不需要时解除引用

内存分配


        一般来说栈内存线性有序存储,容量小,系统分配效率高。而堆内存首先要在堆内存新分配存储区域,之后又要把指针存储到栈内存中,效率相对就要低一些了。

内存泄露
        是指程序上,动态的分配的堆内存,由于某种原因程序未释放或无法释放,造成系统的浪费,导致程序的运行速度减慢,甚至系统崩溃等严重后果。

JavaScript 内存管理


在内存中共用户使用的内存空间分为3部分:

        1.程序存储区

        2.静态存储区

        3.动态存储区

JavaScript 内存空间分配


        栈:变量 基础数据类型,值有固定大小(闭包除外)

        堆:复杂的对象 引用数据类型的大小是不固定的,引用数据类型的值保持在堆内存的变量中

        池:常量

注:JavaScript不允许直接访问堆内存中的位置实际上在操作对象的引用,而不是实际的对象
————————————————
版权声明:本文为CSDN博主「前端老实人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_52691965/article/details/128664283

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

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

相关文章

品牌控价的好处有哪些、品牌控价方法有哪些

今天和大家聊聊【品牌控价】,他们常会说到自己的产品有多好,经销商们体验完也说产品效果非常不错,价格在业内也是有很大优势,但是客户购买量和预期效果确有很大差距,难道我产品性价比这个高,还不能打动顾客…

一种不需要注册没有魔法使用ChatGPT的方法

关于我:关注AIGC、读书、成长和自媒体。加我微信:keeepdance,备注:chatgpt。进ChatGPT交流群。 如果你还没有使用过ChatGPT,那你来对了地方。文章结尾,我将提供一种能不需要梯子、不需要注册,无…

【数据结构.C】顺序表和单链表的增删查改

宝子,你不点个赞吗?不评个论吗?不收个藏吗? 最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要…

干货! CVPR:基于VDB的高效神经辐射渲染场

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 作者介绍 严 涵 上海交通大学2019级人工智能专业本科生,研究兴趣主要是与NeRF相关的三维重建算法。 报告题目 基于VDB高效神经辐射渲染场 内容简介 01 NeRF NeRF的提出起初主要是为了解决新视⻆生成…

shell脚本常用的命令

管理文件内容的使用 一、sort命令二、uniq命令三、tr命令四、cut命令五、split命令六、paste命令七、eval命令 一、sort命令 sort命令是以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序,比较原则是从首字符向后,依次按ASCII码…

尚硅谷Vue配套资源

1.gitee地址: https://gitee.com/coderPatrickStar/Vue/tree/master/%E5%B0%9A%E7%A1%85%E8%B0%B7Vue%E9%85%8D%E5%A5%97%E8%B5%84%E6%BA%90 2.

Linux常用命令——id命令

在线Linux命令查询工具 id 显示用户的ID以及所属群组的ID 补充说明 id命令可以显示真实有效的用户ID(UID)和组ID(GID)。UID 是对一个用户的单一身份标识。组ID(GID)则对应多个UID。id命令已经默认预装在大多数Linux系统中。要使用它,只需…

编译一个开源软件遇到的问题总结

一、开源软件Supra 需要编译一个开源的软件Supra,它需要的前置条件是: 1、cmake ≥ 3.4 2、gcc ≥ 4.8 or min. Visual Studio 2015 (Compiler needs to be supported by CUDA! For that, see the CUDA installation instructions.) 3、QT ≥ 5.5 4、TB…

infuluxdb时序数据库介绍

时序数据库(influxdb) InfluxDB是一个开源的、高性能的时序型数据库,在时序型数据库DB-Engines Ranking上排名第一。 下载地址:https://dl.influxdata.com/influxdb/releases/influxdb2-2.3.0-windows-amd64.zip 启动: CMD到解压…

游戏服务器被攻击怎么办

游戏服务器的安全是每个游戏开发者和管理员必须关注的问题。然而,尽管有各种防御措施,游戏服务器仍然可能受到攻击。小编将为您介绍游戏服务器被攻击的原因,并提供一些解决方案。 游戏服务器被攻击的原因 1. DDoS 攻击 DDoS 攻击是最常见的攻…

【SSA-LSTM】基于SSA-LSTM预测研究(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

CRM软件标准版和定制版有什么分别

CRM系统能够帮助企业管理客户互动,跟踪客户数据,实现业务流程自动化。很多企业不太了解,标准CRM软件和定制CRM软件的区别是什么,该如何选择?下面我们来说说定制CRM的优势。 什么是标准CRM软件? 标准CRM软…

计算机组成原理---第七章 外围设备习题详解版

(一)课本例题 (二)课后习题 1.计算机的外围设备是指除了CPU和内存以外的其它设备。 2.打印机根据印字方式可以分为击打式和非击打式两大类,在击打式类打印机中,只有针型打印型打印机才能打印汉字。 3.一…

Protein Cell:基于R语言的微生物组数据挖掘最佳流程(大众评审截止14号晚6点)...

Protein & Cell综述:基于R语言的微生物组数据挖掘的最佳流程 近日,中国农业科学院刘永鑫组联合南京农业大学袁军组在国际期刊 Protein & Cell (IF 15.3) 发表了题为”“The best practice for microbiome analysis using R”的综述论文&#xf…

辉哥带你学hive第一讲 hive基本介绍以及环境搭建

文章目录 1.Hive介绍1.1 hive 基本情况1.2 Hive架构原理1.3 Hive 安装1.4 元数据配置1.5 hive 服务部署1.6Hive常用交互命令1.6.1 Hive参数配置方式1.Hive介绍 1.1 hive 基本情况 hive基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表。 Hive是一个Hadoop客…

【扰动识别】S变换电能质量扰动识别(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

黎曼积分的概念

黎曼积分的概念 引入 设 f f f是闭区间 [ a , b ] [a,b] [a,b]上的非负连续函数, D D D是坐标系中由直线 x a xa xa, x b xb xb, x x x轴和曲线 y f ( x ) yf(x) yf(x)围成的图形。求 D D D的面积 S S S。 我们可以在 [ a , b ] [a,b] …

蓝桥杯模块学习2——LED灯

第一章 硬件部分 1.1 为什么要了解硬件部分? 比赛的时候会给出原理图,如果我们能够深入的理解硬件,就可以从中推导出代码应该怎样写,而不用死记硬背 1.2 电路的组成部分 1.2.1 74HC573锁存器 原理图: ​​​​​​​…

Claude的奇妙之旅:一起探索人工智能的无限可能

是一款由Anthropic公司开发的人工智能应用,可以在Slack中使用。可以理解和生成自然语言,帮助用户完成各种任务,如写小说、编写代码、解释概念等。的特点是: - 是免费的,不需要申请或下载,只需要在Slack中添…

网络安全合规-OKR和KPI

首先我们还是要区分OKR和KPI的关系区别: 我们可以从几个方面来看两者的差别: 第一,从核心驱动上区分 KPI 以考核为核心驱动;OKR 以成果为核心驱动。 KPI :就是把工作“量化成数据”,当成个人的考核标准&…