news 2026/2/11 13:14:19

<span class=“js_title_inner“>为什么会有 StackOverflow?栈和堆到底有什么区别?</span>

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
<span class=“js_title_inner“>为什么会有 StackOverflow?栈和堆到底有什么区别?</span>
关注我们,设为星标,每天7:30不见不散,每日java干货分享

在计算机的内存世界里,数据只有两个去处:
要么去栈 (Stack),要么去堆 (Heap)

虽然它们都叫“内存”,但待遇天差地别。
一个像是军队的内务,整齐划一,但空间狭小;
一个像是富豪的杂物间,随地乱放,空间巨大。

理解了它们,你就能听懂 Java 里的那句黑话:“对象在堆里,引用在栈里。”


💻 一、技术分析:秩序与自由的权衡

1. 栈 (Stack) —— 先进后出的“弹夹”

  • 特性:LIFO (Last In First Out)。就像一把手枪的弹夹,最后压进去的子弹,必须最先打出来。

  • 存什么:

  • 局部变量:int a = 10;

  • 方法调用链:main()funcA()funcA()funcB()

  • 管理:自动管理。函数执行完,系统自动“弹出”内存,不需要你操心。

  • 速度:极快。CPU 只需要移动指针(ESP)就能分配和回收内存。

  • 大小:很小(通常几 MB)。

2. 堆 (Heap) —— 自由散漫的“广场”

  • 特性:无序、动态。就像一个巨大的广场,你想在哪里搭帐篷就在哪里搭。

  • 存什么:对象 (Object)。凡是new出来的东西(new User(),new int[10000]),都在这里。

  • 管理:手动管理(C/C++ 需要free)或GC 管理(Java/Python 有保洁员)。

  • 速度:较慢。分配内存需要找空地,访问内存需要通过指针跳转。

  • 大小:很大(取决于你的物理内存,几 GB 甚至几十 GB)。


🎒 二、故事场景:收纳盒与杂物间

为了彻底搞懂这两者的关系,我们将内存比作你的家

1. 栈 (Stack) —— “放在手边的收纳盒”

  • 场景: 你坐在书桌前工作(执行函数)。

  • 规则: 书桌空间很小,你只能放最常用的东西。

  • 操作:

  • 函数调用: 你开始写作业 A。你在书桌上铺了一张纸(压栈)。

  • 嵌套调用: 作业 A 需要用到作业 B 的数据。你又拿出作业 B 的纸,盖在A 上面。

  • 再嵌套: 作业 B 需要作业 C。你把 C 的纸盖在B 上面。

  • 执行完毕: C 做完了,你把 C 的纸扔掉(弹栈),露出下面的 B。

  • 特点: 永远只能处理最上面那一层。非常有条理,绝对不会乱。

2. 堆 (Heap) —— “巨大的杂物间”

  • 场景: 你需要组装一辆自行车(创建一个大对象)。

  • 问题: 书桌(栈)太小了,根本放不下自行车。

  • 操作:

  • • 你走到宽敞的杂物间 (Heap),找块空地,把自行车组装好。

  • 关键步骤: 你回到书桌前,在纸上写下一行字:“自行车在杂物间 A 区 3 排”

  • • 这行字(内存地址/引用),是在栈里的。

  • • 自行车本身,是在堆里的。


💥 三、两大经典灾难

1. StackOverflowError (栈溢出)

  • 场景:无限递归

  • 故事:

  • • 你讲了个故事:“从前有座山,山里有座庙,庙里有个老和尚讲故事:‘从前有座山,山里有座庙...’”

  • • 你每讲一次,就往书桌上铺一张纸。

  • • 讲到第 10000 次时,书桌上的纸摞到了天花板,轰的一声倒了。

  • 原因: 函数调用层级太深,超出了栈的深度限制。

2. OutOfMemoryError (OOM - 堆溢出)

  • 场景:囤积癖

  • 故事:

  • • 你疯狂地买自行车(new Object),买一辆就扔进杂物间。

  • • 杂物间虽然大,但也有塞满的时候。

  • • 如果你光买不扔(没有被 GC 回收),最后杂物间连一只脚都插不进去了。

  • 原因: 创建了太多对象,且都在被使用,无法回收,把堆撑爆了。


🥊 四、巅峰对决:为什么需要两个?

维度

栈 (Stack)堆 (Heap)
比喻收纳盒杂物间
存储内容

局部变量、引用指针

new

出来的对象、实体

访问速度极快

(CPU亲儿子)

较慢

(需要查地址)

空间大小

(MB 级别)

(GB 级别)

生命周期

函数结束自动释放

等待 GC 回收

溢出报错StackOverflowErrorOutOfMemoryError

🎯 五、总结:指针的羁绊

在 Java/C++ 中,栈和堆不是割裂的,它们通过“引用” (Reference/Pointer)紧紧联系在一起。

User user = new User();

这行简单的代码,其实横跨了两个世界:

  1. 1.左边User user**: 是一个引用**(小纸条),存在里。

  2. 2.右边new User()**: 是一个对象**(大自行车),存在里。

  3. 3.=: 是一根红线,把栈里的纸条指向了堆里的自行车。

一句话总结:栈是运行时的单位(处理逻辑),堆是存储的单位(存放数据)。

推荐阅读 点击标题可跳转

50个Java代码示例:全面掌握Lambda表达式与Stream API

16 个 Java 代码“痛点”大改造:“一般写法” VS “高级写法”终极对决,看完代码质量飙升!

为什么高级 Java 开发工程师喜爱用策略模式

精选Java代码片段:覆盖10个常见编程场景的更优写法

提升Java代码可靠性:5个异常处理最佳实践

为什么大佬的代码中几乎看不到 if-else,因为他们都用这个...

还在 Service 里疯狂注入其他 Service?你早就该用 Spring 的事件机制了

看完本文有收获?请转发分享给更多人

关注「java干货」加星标,提升java技能

❤️给个「推荐 」,是最大的支持❤️

.cls-1{fill:#001e36;}.cls-2{fill:#31a8ff;}

.cls-1{fill:#001e36;}.cls-2{fill:#31a8ff;}

.cls-1{fill:#001e36;}.cls-2{fill:#31a8ff;}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/10 22:00:41

大数据领域Kappa架构的分布式计算特性

大数据领域Kappa架构的分布式计算特性:用"流水生产线"思维破解实时与离线的双重难题 关键词:Kappa架构、分布式计算、流处理、事件日志、容错性、水平扩展、一致性 摘要:传统大数据架构中,实时与离线处理的"双系统困境"一直是工程师的噩梦。2014年提出…

作者头像 李华
网站建设 2026/2/11 7:20:06

大模型时代,我这样学习AI技能,不仅没被取代,工资还涨了

01 大模型技术,职业升级的时代引擎 大模型技术的爆发正在重塑就业市场。根据行业观察,大量公司急需懂大模型的工程师,这类岗位的薪资普遍高于传统开发岗。 更为重要的是,如今入行大模型应用开发的门槛已大幅降低。借助开源社区和…

作者头像 李华
网站建设 2026/2/11 7:20:03

【游戏推荐】冰汽时代2 全DLC 送修改器(Frostpunk 2)免安装中文版

类型: 城市营造, 生存, 策略 链接:https://pan.quark.cn/s/a1cc71f6cd51 游戏简介 冰汽时代从未结束 游戏的故事发生在《冰汽时代》中毁灭性暴风雪平息后的30年,永无止尽的冰天雪地依旧覆盖着这片大地。你将扮演一个资源匮乏的大都市的领袖…

作者头像 李华
网站建设 2026/2/10 13:21:40

设备监控随时随地可控,用Uptime Kuma+cpolar告别限制

Uptime Kuma 是一款跨平台的开源监控工具,核心功能是实时监测 HTTP、TCP、游戏服务器、物联网设备等各类服务的运行状态,一旦发现异常能通过微信、电报等 70 余种渠道推送提醒,它的适用人群涵盖个人站长、物联网爱好者、中小企业运维人员等&a…

作者头像 李华
网站建设 2026/2/10 11:07:21

【2025年RE SCI1区TOP】改进鲸鱼优化算法IWOA+多尺度聚类集成与相似性匹配的综合风电预测系统附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎 往期回顾关注个人主页:Matlab科研工作室 👇 关注我领取海量matlab电子书…

作者头像 李华
网站建设 2026/2/11 8:00:16

<span class=“js_title_inner“>单菌基因组数据分析 (往期内容) 合集 2026.1.20</span>

单菌基因组数据分析 工具详解SRA公共测序数据的检索、下载从公共数据库获取细菌基因组的测序数据公共数据对细菌基因组的重要性及SRA使用模式菌(流行病学、进化)与非模式菌(组装、注释)获取公共数据 (二代三代)从公共数据库中获取同一株菌的illunima、pacbio以及nanopore测序数…

作者头像 李华