核心解答

Goroutine 初始栈之所以设定为 2KB,其核心动机是支持极高规模的并发(即“百万级 Goroutine”目标)。

  1. 高并发目标:为了在有限的内存中运行数百万个并发任务,每个任务占用的内存必须极小。如果像系统线程那样占用 MB 级别,内存会迅速枯竭。
  2. 动态按需增长:为了兼顾“初始极小”和“运行安全”,Go 实现了 Go 栈伸缩机制
    • 按需分配:初始仅分配 2KB,随着函数调用深度增加,Runtime 会自动触发栈扩容
    • 连续栈(Continuous Stacks):当空间不足时,Go 会分配一块更大的内存,并将旧栈内容整体拷贝过去,同时更新所有指向旧栈的指针。
  3. 轻量级优势:这种“先小后大、按需伸缩”的策略,使得 Go 在处理海量连接时具有天然的内存优势。

解答思路

  1. 动机先行:强调 Go 的设计目标是高并发,因此必须降低单个任务的内存开销。
  2. 实现手段:解释如何通过“动态扩容”来解决初始空间不足的问题。
  3. 关键技术:简述连续栈和栈拷贝的实现原理。

深度解析与面试技巧

面试官追问方向
  • 栈缩容:Go 什么时候会回收栈空间?(通常在 GC 期间,如果栈使用率低于 1/4,会缩容至 1/2)。
  • 逃逸分析:如果变量太大或生命周期超过函数,会发生什么?(会分配到堆上,不占用栈空间)。