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

(27)APS.NET Core8.0 堆栈原理通俗理解

1.概述

.NET(C#)的内存管理涉及两个主要部分:堆(Heap)和栈(Stack)。这两个结构在数据存储和管理方式上有显著的不同,它们对程序性能和资源使用有重要影响。想象一下你的电脑内存是一个巨大的仓库,这个仓库里有两个非常重要的区域来存放东西,即数据(栈和堆)。下面让我们用一种非常通俗易懂的方式来“图解”.NET中的堆栈原理。

2.栈(Stack)与堆(Heap)

就如上面所形容,内存是一个巨大的仓库,而这个仓库里有两个非常重要的区域来存放东西。栈区域空间小,用来存放一摞井井有条的储物箱;而堆区域空间大,像一个大货架,东西可以随便乱放。具体如下图所示:

3.栈(Stack)

栈(Stack)像一摞“储物箱”。
●特点
  ◎后进先出 (LIFO):就像一摞储物箱,你只能从最上面放箱子或拿箱子。最后放上去的箱子,总是最先被拿下来。
  ◎速度快:因为存取顺序严格,分配和释放内存非常快,就是移动一下“指针”的位置。
  ◎空间小:这摞储物箱的总高度是有限的,所以不能放太多太大的东西。
  ◎自动管理:当一个函数执行完毕后,它对应的那层“箱子”就会被整个扔掉(内存自动释放)。
●里面存什么?
  ◎值类型:比如int, double, bool, struct等。
  ◎函数的调用信息:比如函数执行到哪了,函数的参数是什么。
●工作过程图解
假设我们有一个这样的程序:

void MethodA() {int a = 10; // 在栈上分配一个叫a的箱子,里面放10MethodB(a);
}void MethodB(int num) {int b = 20; // 在栈上分配一个叫b的箱子,里面放20// ... 做一些事情
}// 主程序
Main() {MethodA();
}

栈的变化就像下面这个动态过程:
①Main函数开始:先为Main函数压入一个“箱子”(栈帧)。

栈:[Main箱]

②Main调用MethodA:在Main箱上面压入一个MethodA箱。MethodA的箱子里有了变量a=10。

栈:[Main箱][MethodA箱(a=10) ] <-- 栈顶

③MethodA调用MethodB:在MethodA箱上面再压入一个MethodB箱。并把参数num=10和变量b=20放进去。

栈:[Main箱][MethodA箱(a=10)][MethodB箱(num=10, b=20)] <-- 栈顶

④MethodB执行完毕:最顶上的MethodB箱被整个扔掉(里面的num和b都消失了)。

栈:[Main箱][MethodA箱(a=10)] <-- 栈顶

⑤MethodA执行完毕:MethodA箱被扔掉。

栈:[Main箱] <-- 栈顶

⑥Main执行完毕:栈被清空。
这个过程就像叠箱子和拆箱子,井然有序。

4.堆(Heap)

堆(Heap)像一片“大货架”。
●特点
  ◎任意存取:你可以在这个大货架的任何空位存放东西,没有顺序要求。
  ◎速度相对慢:找空位和整理货架需要时间(分配慢),找东西也需要“地址标签”(访问慢一点)。
  ◎空间大:货架空间很大,可以存放大型对象。
  ◎需要垃圾回收(GC):东西不要了不会自己清理,需要仓库管理员(垃圾回收器)定期来检查,把没人要的东西清走,腾出空间。
●里面存什么?
  ◎引用类型:比如string、class、数组等。
●工作过程图解
假设我们有一个这样的程序:

void CreateObject() {// myClass是一个在栈上的“地址标签”// new MyClass() 是在堆上的“大货架”上开辟空间创建的实际对象MyClass myClass = new MyClass();myClass.Data = 5;// ... 使用这个对象
}
// myClass这个“地址标签”随着CreateObject函数结束就被销毁了。
// 但堆上的那个对象还在,直到GC管理员来清理它。

这个过程可以这样理解:

①执行new MyClass()时,在堆上找一块足够大的空位,创建这个对象。
②在栈上(当前函数的箱子里)创建一个局部变量myClass。这个变量不存储对象本身,只存储对象在堆上的地址(就像一张写着“货架A区-05号”的纸条)。
③当我们操作myClass.Data时,.NET会根据栈上的“地址纸条”(0x123ABC)去堆里找到那个真正的对象,然后修改它的数据。
④当函数CreateObject执行完毕,它在栈上的那个“箱子”被销毁了,里面的“地址纸条”(变量myClass)自然也销毁了。此时,堆上的那个对象就失去了所有引用,变成“垃圾”。
⑤过一段时间,仓库管理员(垃圾回收器GC)会来打扫卫生,发现这个没人要的对象,就会把它从堆上清除掉,腾出空间。

5.总结与对比

特性栈 (Stack) 堆 (Heap)
存储内容值类型,函数调用帧引用类型对象
管理方式自动,函数结束立即释放手动(由GC管理),不确定何时释放
分配速度非常快,只是移动指针相对慢,需要查找可用空间
灵活性不灵活,大小固定,生命周期严格灵活,空间大,生命周期不确定
访问方式直接,直接访问变量间接,通过引用(地址)访问
碎片有(但GC会整理压缩)
类比一摞储物箱,后进先出一个大货架,随意存取

希望这个用“仓库”、“箱子”和“货架”做的比喻,能帮你非常直观地理解.NET的堆栈原理!

参考文献:
Deepseek https://chat.deepseek.com/

http://www.dtcms.com/a/427086.html

相关文章:

  • SVN 一些命令疑问
  • 精读 C++20 设计模式:行为型设计模式 — 状态机模式
  • 多周期路径约束
  • Webpack配置之path.join、path.resolve和__dirname详解
  • vue打包优化方案都有哪些?
  • Golang 中的字符串:常见错误和最佳实践
  • 花生壳建设网站怎样做网络营销推广
  • 【Rust GUI开发入门】编写一个本地音乐播放器(8. 从文件中提取歌曲元信息)
  • 国内个人网站建设贾汪城乡建设局网站
  • CentOS二进制安装包方式部署K8S集群之系统初始化
  • Spring Boot 缓存集成实践
  • 力扣Hot100--21.合并两个有序链表
  • 网络安全和NLP、CV是并行的应用吗?
  • 如何做好一个企业网站专门做图片的网站
  • 网页设计网站wordpress公告栏插件
  • C++ 位运算 高频面试考点 力扣 371. 两整数之和 题解 每日一题
  • 网络安全常见敏感目录字典
  • React学习(三)--- 组件化开发编写css
  • 设计模式(C++)详解——观察者模式(Observer)(1)
  • 网站建设报表明细新手做网站看什么书
  • 微课网站开发如何查看网站域名
  • Spring工程 生成表和mapper文件
  • 服装培训网站建设网站图片切换
  • Python爬虫实战:获取丁香人才网招聘信息与数据分析
  • 光学转镜最小长度计算模型:基于视场角与有效口径的匹配算法
  • 汉子由来 外国人做的网站网页设计的尺寸是指
  • 智能驱动与合规双赢:2025年企业DevOps平台选型深度解析
  • 2025年,如何选择Python Web框架:Django, Flask还是FastAPI?
  • FLASK与JAVA的多文件互传(多文件互传亲测)
  • 蓝牙音箱的技术演进:从便捷到高保真的音频革命