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

深入解析:(27)APS.NET Core8.0 堆栈原理通俗理解

深入解析:(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的箱子,里面放10
    MethodB(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.hskmm.com/?act=detail&tid=22771

相关文章:

  • VMware Service某些服务关闭导致虚拟机开机无法获取IP地址
  • 2025中国无缝钢管厂家 TOP 品牌权威推荐,SA106 无缝钢管,A106B 无缝钢管,SA53B 无缝钢管精选无缝钢管工厂
  • 在AI技术唾手可得的时代,挖掘用户真实需求成为产品成功的关键——某知名设备电量监控工具需求探索
  • 2025 年润滑脂厂家 TOP 企业品牌推荐排行榜,道达尔润滑脂,工业润滑脂,合成润滑脂,高温润滑脂,轴承润滑脂推荐这十家公司!
  • 2025切割机厂家TOP企业品牌推荐排行榜,五轴水刀,大理石水刀,全自动水刀,高压水刀,手持式水刀,高压水刀,大理石水刀,便携式水刀切割机公司推荐!
  • 二十八、API之《System 类》——与框架交互的“桥梁”
  • 2025橡胶木板材厂家TOP企业品牌推荐排行榜,泰国橡胶木板材,橡胶木免漆板,橡胶木 PET,橡胶木门板,AA 橡胶木,橡胶木指接板公司推荐!
  • 2025润滑油供应商最新权威推荐排行榜:聚焦耐磨润滑油、工业润滑油、鑫美工业润滑油、壳牌润滑油、道达尔润滑油助力企业采购决策
  • 多状态循环泵控件开发
  • 2025活塞杆厂家TOP企业品牌推荐排行榜,精密,不锈钢,调制,超长,油缸,气缸,镀铬,大直径,精细活塞杆推荐这十家公司!
  • 2025房屋鉴定机构服务平台推荐排行榜,房屋安全评估,承载力,工程质量,危房,受损伤,舞台架结构安全鉴定,房屋消防电器安全鉴定评估,火灾后房屋安全鉴定推荐这十家公司!
  • 实用指南:WSL2搭建Hadoop伪分布式环境
  • 3整数规划-分支定界法
  • [apple pencil二代充不上电]
  • 分布式光纤声波振动与AI的深度融合:开启智慧感知新时代 - 指南
  • 2025液压扳手实力厂家推荐榜:精准扭矩与耐用品质专业之选
  • 2025试验机实力厂家品牌公司最新权威推荐榜:精准测试与技术创新标杆之选
  • AI元人文:价值共生体系统——构建人机文明的演进基石——DeeoSeek融合
  • 2025喷涂厂家TOP企业品牌推荐排行榜,喷涂、喷涂设备、 喷涂生产线、喷涂流水线推荐这十家公司!
  • 完整教程:【JAVA】【BUG】经常出现的典型 bug 及解决办法
  • 浅析 AC 自动机
  • 2025百度官网认证作用代理商推荐,北京益百科技通过官网认证,助力企业优化搜索排名,提升用户体验,降低营销成本
  • 读人形机器人28智慧城市2
  • VMware ESXi 9.0.1.0 发布 - 领先的裸机 Hypervisor
  • VMware vSphere 9.0.1.0 发布 - 企业级工作负载平台
  • 《索引实战:结构与场景解析》 - 详解
  • Hadoop完全分布式配置 - 实践
  • VMware Cloud Foundation Automation 9.0.1.0 发布 - 私有云自动化平台
  • VMware Cloud Foundation Operations 9.0.1.0 发布 - 私有云运维管理
  • VMware Cloud Foundation Operations for Networks 9.0.1.0 发布 - 云网络监控与分析