goroutine 栈是如何“自动扩容”的?
前言goroutine 初始栈很小(≈2KB)但可以自动变大。那它是怎么做到的一、先说结论goroutine 的栈扩容是通过在函数调用前做“栈空间检查”如果不够就调用 runtime 进行扩容。关键机制是stack guard morestack二、goroutine 栈和线程栈的根本不同线程栈创建时一次性分配(例如 1MB)固定大小不会自动扩容goroutine 栈初始 2KB连续内存可以复制到更大的内存块原栈释放本质是不够就“整体搬家”三、栈扩容是如何触发的Go 在每个函数调用前都会插入一段检查代码。类似(伪代码)CMP SP, stackGuard JLS morestack意思是当前栈指针 SP 是否快碰到 guard 线如果栈空间不够跳转到 morestack这就是触发扩容的入口。四、stack guard 是什么每个 goroutine 结构体里有g.stack.lo // 栈底 g.stack.hi // 栈顶 g.stackguardstackguard是一个阈值。当SP stackguard说明栈快用完了。就必须扩容。五、morestack 做了什么这是扩容的核心函数。大致流程① 计算需要多大栈通常策略是新栈大小 旧栈 × 2例如2KB → 4KB → 8KB → 16KB → …指数增长。② 分配一块更大的连续内存在堆上分配新的栈空间。③ 把旧栈内容复制到新栈这是关键步骤。因为 goroutine 栈是“连续栈”所以整块内存直接 memcpy 过去。④ 修正指针复制后要修正栈内的指针frame pointerdefer 链panic 结构GC 元数据因为栈地址变了。⑤ 更新 g.stack把 goroutine 的栈地址更新为新栈。⑥ 继续执行原函数扩容完成后函数继续执行。对程序来说是“透明的”。六、为什么 Go 现在用“连续栈”早期 Go 用的是分段栈(segmented stack)每次不够就链接一个新栈段。像这样[segment1] - [segment2] - [segment3]问题每次函数调用都要检查段边界性能开销大复杂后来改成连续栈 复制扩容好处调用更快栈布局简单GC 更容易扫描这是现代 Go 的设计。七、栈什么时候会缩小扩容是自动的。缩小也会发生但不是立刻。当 goroutine 进入安全点(比如 GC)时如果发现栈用量远小于当前大小runtime 可能会缩小栈但缩小不是频繁操作。八、一个形象类比想象你租了一个 2 平米的小房间。东西放不下了怎么办不是再租一个小房间接起来。而是直接搬去 4 平米的房子。再不够搬去 8 平米。每次整体搬家。九、为什么复制栈不会出问题因为 Go 有两个保证栈内指针可追踪(编译器知道哪些是指针)GC 是精确 GC(精确知道指针位置)所以可以安全更新。十、栈扩容和抢占的关系有个很有意思的点抢占机制也复用了 stack guard。当g.preempt trueruntime 会故意把 stackguard 改成特殊值。让下次函数调用时直接进入 morestack然后在 morestack 里判断哦这是抢占不是扩容。于是进入调度器。这是一种“借道实现”。十一、栈扩容的成本高吗扩容是罕见操作指数增长很少发生很多次例如一个 goroutine 可能一生只扩容 2~3 次。所以总体成本可接受。十二、终极总结goroutine 自动扩容的机制是函数调用前做栈检查 → 不够则调用 morestack → 分配更大连续栈 → 复制旧栈 → 修正指针 → 继续执行核心技术点stack guardmorestack连续栈复制指针修正

相关新闻

19岁嫁豪门,20岁离婚带儿子净身出户,单亲40年如今儿子为她争气

19岁嫁豪门,20岁离婚带儿子净身出户,单亲40年如今儿子为她争气

1958年的香港,19岁的林淑芬穿着租来的婚纱站在教堂彩窗前,钻石项链在颈间泛着冷光。这场豪门婚姻像一场绚丽的烟火,在众人艳羡中绽放,又在一年后骤然熄灭。当她抱着襁褓中的儿子走出半山别墅时,晨雾打湿了旗袍下摆&…

2026/5/17 3:19:07 阅读更多 →
大数据领域分布式计算的可扩展性研究

大数据领域分布式计算的可扩展性研究

大数据领域分布式计算的可扩展性研究关键词:分布式计算、可扩展性、水平扩展、垂直扩展、CAP定理、弹性伸缩、负载均衡摘要:在数据量以“ZB”为单位增长的今天,单机计算早已无法满足需求。分布式计算通过多台机器协作处理海量数据&#xff0c…

2026/7/4 2:36:31 阅读更多 →
基于Spark的豆瓣读书分析大屏可视化(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于Spark的豆瓣读书分析大屏可视化(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

基于Spark的豆瓣读书分析大屏可视化(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码数据采集:豆瓣读书网站爬虫(requests、lxml、…) 数据存储:将爬取的数据保存为csv文件,保存到本地或上传到…

2026/7/3 6:21:07 阅读更多 →

最新新闻

UE5 C++ 射线检测多物体:LineTraceMultiByObjectType详解

UE5 C++ 射线检测多物体:LineTraceMultiByObjectType详解

1. UE5 C 射线检测多物体的按通道与按对象类型 LineTraceMultiByObjectType 详解在虚幻引擎5(UE5)开发中,射线检测(Line Trace)是最常用的物理检测手段之一。今天我要分享的是如何通过C实现多物体射线检测,…

2026/7/4 19:09:28 阅读更多 →
Unity编辑器工具:高效处理3D模型的实用技巧

Unity编辑器工具:高效处理3D模型的实用技巧

1. Unity编辑器工具概述:模型处理的核心利器在Unity开发流程中,Editor工具链是提升工作效率的关键组件。针对3D模型处理这一高频需求,Unity提供了一系列原生和可扩展的编辑器功能,能够覆盖从资源导入到场景配置的全流程。不同于常…

2026/7/4 19:05:27 阅读更多 →
Mirror网络库插件优化与实战应用指南

Mirror网络库插件优化与实战应用指南

1. Mirror网络库插件深度解析Mirror作为Unity环境下广受欢迎的高性能网络库,其插件系统在实际项目开发中扮演着关键角色。这次我们将深入探讨第6代插件的核心特性与实战应用技巧,这些经验来自三个不同规模项目的实际验证。1.1 插件架构设计理念Mirror插件…

2026/7/4 19:05:27 阅读更多 →
数据中台架构设计与治理实战指南

数据中台架构设计与治理实战指南

1. 数据中台生态系统的核心价值三年前我接手某零售集团数据治理项目时,第一次深刻体会到数据孤岛的破坏力——市场部用T3的销售数据做促销决策,而仓储系统显示的是实时库存,这种数据割裂直接导致了一次千万级的营销事故。这正是数据中台要解决…

2026/7/4 19:03:27 阅读更多 →
claudecode如何放权?自动执行命令不再询问

claudecode如何放权?自动执行命令不再询问

0.shift tab开启自动模式1. 打开设置文件:在项目根目录或全局目录下找到 .claude/settings.json。2. 添加通配符白名单:修改 permissions 字段,加入 "Bash(*)"。完整配置如下:json{"permissions": {"all…

2026/7/4 19:03:27 阅读更多 →
LeetCode:买卖股票的最佳时机(1-3) - Python

LeetCode:买卖股票的最佳时机(1-3) - Python

121. Best Time to Buy and Sell Stock(买卖股票的最佳时机) 问题描述: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计…

2026/7/4 18:55:26 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻