核心结构 · 核心原理 · 核心技术
👆 悬停各区域查看详情
Go 使用轻量级协程 (Goroutine)替代传统线程,
由 MPG 三元组实现高效调度。
G (Goroutine) → 任务M (Machine) → OS线程P (Processor) → 调度上下文
编译器分析决定变量应该分配在栈还是堆:
✓ 栈分配:函数返回后自动回收,零开销
✗ 堆分配:需要 GC 回收,有一定开销
go build -gcflags '-m' 可查看逃逸分析结果
Go 采用三色标记并发 GC,最小化 Stop The World:
⚪ 白 → 🔵 灰 → 🟢 黑 → 完成
采用线程缓存分配 (TCMalloc) 策略:
span (大对象) |
cache (小对象) |
central (中转)
Go 的栈是动态增长的,每个 Goroutine 起始只有 2KB, 按需扩张,最大可达 1GB。
堆是 GC 的主战场,存储需要跨函数存活的对象。 Go 的堆分配采用多级管理。
编译器静态分析决定变量应该分配在哪里。 能栈不堆是 Go 的核心理念。
// 不会逃逸,栈分配
func add(a, b int) int { return a + b }
// 会逃逸,堆分配
func initMap() *map[int]int {
m := make(map[int]int)
return &m
}
Go 1.5+ 采用并发三色标记 GC, 通过 Write Barrier 保证一致性。
Go 的调度器将百万级 Goroutine 映射到少量 OS 线程, 实现高效并发。
✓ 对比线程:创建快 1000x
✓ 切换快:只需切换 SP/PC/寄存器
✓ 调度灵活:用户态完成
Go 内存模型定义了Happens Before关系, 保证并发程序的可预测性。
var a string
var done bool
func setup() {
a = "hello"
done = true
}
func main() {
go setup()
for !done {}
print(a) // 可能打印空!