当前位置: 首页 > news >正文

9. 堆和栈有什么区别

总结

  • :用于存储基本数据类型,速度快,生命周期明确;
  • :用于存储引用类型,空间大但访问慢,依赖垃圾回收机制;
  • JavaScript 中变量的存储方式取决于其类型;
  • 理解堆栈机制有助于优化代码性能、避免内存泄漏。

建议:在开发中合理使用基础类型和引用类型,注意变量作用域和引用关系,以提升应用性能和稳定性。


概述

在 JavaScript 中,堆(Heap)栈(Stack) 是两种不同的内存分配区域,用于存储程序运行时的数据。理解它们的区别有助于我们更好地理解变量存储机制、性能优化以及垃圾回收机制。


一、栈(Stack)

1. 定义

栈是一种自动分配和释放的内存区域,用于存储基本数据类型(如 numberstringbooleanundefinednullsymbolbigint)和函数调用时的执行上下文。

2. 特点

特性说明
存取速度快因为栈的结构是后进先出(LIFO),内存是连续的
生命周期明确变量进入作用域时分配内存,离开作用域时自动释放
空间有限栈的大小有限,不能存放大量数据
存储基础类型number, string, boolean

3. 示例

let a = 10;
let b = a;
b = 20;console.log(a); // 10
console.log(b); // 20
  • ab 是两个独立的栈内存地址,互不影响。

二、堆(Heap)

1. 定义

堆是一种动态分配的内存区域,用于存储引用类型(如 objectarrayfunction)的实际数据。

2. 特点

特性说明
动态分配内存大小不固定,运行时动态分配
存取速度较慢因为堆内存是无序的,需要通过引用地址访问
需要垃圾回收不再使用的对象由垃圾回收机制自动清理
存储引用类型如对象、数组、函数等

3. 示例

let obj1 = { name: "Tom" };
let obj2 = obj1;
obj2.name = "Jerry";console.log(obj1.name); // Jerry
console.log(obj2.name); // Jerry
  • obj1obj2 指向堆中的同一个对象,修改一个会影响另一个。

三、堆和栈的区别总结

特性栈(Stack)堆(Heap)
存储内容基础数据类型引用类型(对象、数组、函数等)
分配方式自动分配动态分配
存取速度相对较慢
生命周期进入作用域分配,离开释放手动分配,由垃圾回收机制管理
空间大小小且有限大,适合存储大量数据
是否共享不共享多个变量可指向同一对象
值传递 vs 引用传递值传递(拷贝副本)引用传递(共享内存地址)

四、JavaScript 中的内存管理机制

1. 自动垃圾回收(GC)

JavaScript 引擎(如 V8)会自动管理内存的分配和回收:

  • 当一个对象不再被引用时,垃圾回收器会将其从堆中清除。
  • 栈中的变量在作用域结束后自动出栈,无需手动管理。

2. 垃圾回收策略

  • 标记清除(Mark and Sweep):主流策略,标记不再使用的对象并清除。
  • 引用计数(Reference Counting):已逐渐淘汰,容易导致循环引用问题。

五、性能优化建议

建议说明
避免频繁创建大对象减少堆内存分配和 GC 压力
使用局部变量局部变量存储在栈中,访问速度快
避免循环引用防止内存泄漏
合理使用 constlet有助于优化变量作用域和内存管理

http://www.xdnf.cn/news/1270189.html

相关文章:

  • Vitalik谈以太坊:ETH财库储备策略“有益且有价值”
  • Kotlin 协程线程切换机制详解
  • AG32cpld实现一个UartTx“外设”
  • 智慧能源设备巡检缺陷漏检率↓76%:陌讯多模态融合算法实战解析
  • Android适配最新SplashScreen方案:让启动页不再“翻车“
  • webrtc弱网-BandwidthQualityScaler 源码分析与算法原理
  • 视图是什么?有什么用?什么时候用?MySQL中的视图
  • Android MediaCodec 音视频编解码技术详解
  • linux php版本降级,dnf版本控制
  • Amazon Linux 训练lora模型的方式
  • Web自动化技术选择
  • 回答“http协议 ,js组件化,工程化, seo优化策略 ,针对不同平台终端适配 web标注和兼容性”
  • 基于遗传优化的智能灌溉系统控制策略matlab仿真
  • Beelzebub靶机通关教程
  • 【工具】Python多环境管理
  • 【Java基础】字符串不可变性、string的intern原理
  • 【李宏毅-2024】第六讲 大语言模型的训练过程1——预训练(Pre-training)
  • 搭建若依前后端分离版本的开发环境
  • 鸿蒙分布式任务调度深度剖析:跨设备并行计算的最佳实践
  • 在nodejs中使用Java方法
  • windows、linux应急响应入侵排查
  • React中实现完整的登录鉴权与权限控制系统
  • 云服务器--阿里云OSS(2)【Springboot使用阿里云OSS】
  • 原生Vim操作大全
  • Python映射合并技术:多源数据集成的高级策略与工程实践
  • Jmeter性能测试之安装及启动Jmeter
  • [Oracle] TRUNC()函数
  • imx6ull-驱动开发篇15——linux自旋锁
  • OpenAI开源大模型 GPT-OSS 开放权重语言模型解析:技术特性、部署应用及产业影响
  • Ubuntu系统忘记密码怎么办?