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

javascript中栈内存与堆内存如何理解?以及如何区分?

在 JavaScript 中,内存管理是自动进行的,由 JavaScript 引擎负责。尽管如此,理解栈内存(Stack Memory)和堆内存(Heap Memory)之间的区别对于理解变量存储机制、内存分配和垃圾回收非常重要。

栈内存

栈内存是一种线性数据结构,它遵循先进后出(LIFO, Last In First Out)的原则。栈内存主要用于存储函数调用、局部变量、函数参数以及程序执行的上下文。栈内存的特点包括:

  • 快速访问:由于栈是一种简单的数据结构,访问和操作栈的速度非常快。
  • 有限大小:栈的大小是有限的,当栈空间耗尽时会发生栈溢出(stack overflow)。
  • 自动管理:栈内存中的数据通常在函数执行结束时自动释放。

在 JavaScript 中,原始数据类型(如 Number, String, Boolean, Undefined, NullSymbol)的值直接存储在栈内存中。这意味着原始类型的值是按值访问的,并且在栈内存中直接保存这些值。

let number = 10; // 原始类型的值存储在栈内存中
let string = "Hello"; // 字符串值存储在栈内存中

堆内存

堆内存是一大片内存空间,它不像栈内存那样有序。堆内存主要用于存储对象(如数组、函数、类的实例等)。堆内存的特点包括:

  • 动态分配:堆内存可以按需申请空间,并且访问速度比栈内存慢。
  • 手动管理:在一些低级语言中,堆内存需要程序员手动管理。但在 JavaScript 中,垃圾回收机制自动管理堆内存。
  • 持久性:堆内存中的数据可以长时间存在,直到垃圾回收机制判定其不再使用时才会被释放。

在 JavaScript 中,对象的引用存储在栈内存中,而对象本身的数据存储在堆内存中。这意味着,当你声明一个对象时,栈内存中会保存一个指向堆内存中对象的指针。

let object = { name: "Alice" }; // 对象的引用存储在栈内存中,对象本身存储在堆内存中

如何区分

  • 原始类型 vs 对象类型:原始类型的值直接存储在栈内存中,而对象类型的引用存储在栈内存中,对象本身的数据存储在堆内存中。
  • 存储方式:栈内存中的数据是按值存储的,堆内存中的数据是按引用存储的。
  • 生命周期:栈内存中的数据通常在函数执行结束后自动释放,而堆内存中的数据则在不再被引用时由垃圾回收机制回收。

示例

假设我们有一个简单的 JavaScript 程序,如下所示:

function example() {
    let a = 10;           // a 存储在栈内存中
    let b = { value: 20 }; // b 的引用存储在栈内存中,对象存储在堆内存中
    let c = "string";     // c 存储在栈内存中

    // 修改对象的属性会影响堆内存中的数据
    b.value = 30;
    
    // 函数执行结束后,a, b, c 的引用从栈内存中移除
}

example();

在这个例子中,ac 是原始类型的值,直接存储在栈内存中。b 是一个对象的引用,存储在栈内存中,而对象本身存储在堆内存中。当 example 函数执行结束时,栈内存中的 a, b, c 的引用被移除,但由于 b 对象仍存在于堆内存中,直到垃圾回收机制判定其不再被任何变量引用时才会被回收。

理解栈内存和堆内存之间的区别有助于更好地管理内存资源,尤其是在处理大型对象或复杂数据结构时,这对于避免内存泄漏和优化性能至关重要。


http://www.kler.cn/news/311130.html

相关文章:

  • 力扣150题——多维动态规划
  • Android AlertDialog圆角背景不生效的问题
  • Mybatis 和 数据库连接
  • Redis搭建集群
  • 如何更换OpenHarmony SDK API 10
  • 前端项目使用js将dom生成图片、PDF
  • Linux安装、Nginx反向代理、负载均衡学习
  • 95. UE5 GAS RPG 实现创建多段飞弹攻击敌人
  • C语言——自定义类型
  • Nginx 实现七层的负载均衡
  • 4位整数的数位和
  • OJ在线评测系统 前端开发设计优化通用菜单组件二 调试用户自动登录
  • 面试官:什么是CAS?存在什么问题?
  • 探索RESTful风格的网络请求:构建高效、可维护的API接口【后端 20】
  • AI换脸等违法行为的最关键原因是个人隐私信息的泄露,避免在网络上发布包含个人敏感信息的照片。
  • 图书管理系统(面向对象的编程练习)
  • 高级c语言(一)
  • Mybatis续
  • 36.贪心算法3
  • Android 内置应用裁剪
  • Java集合面试(上)
  • Kafka+PostgreSql,构建一个总线服务
  • k8s 微服务 ingress-nginx 金丝雀发布
  • ESRGAN——老旧照片、视频帧的修复和增强,提高图像的分辨率
  • ozon买家网址是什么,跨境电商ozon买家网址
  • YOLOv8的GPU环境搭建方法
  • 一个基于 laravel 和 amis 开发的后台框架, 友好的组件使用体验,可轻松实现复杂页面(附源码)
  • 一对一,表的设计
  • Nginx中return和rewrite的区别
  • python 实现entropy熵算法