- 堆和栈的区别
- 存储方式
- 栈是线性数据结构、采用先进后出的方式存储数据。栈通常用于存储局部变量、函数的参数,栈上的存储空间是有限且固定的,由编译器和操作系统控制。
- 堆是树型数据结构,用于动态分配和管理内存,堆内存的大小根据需要动态调整,通常比栈大,用于存储复杂的数据结构
- 生命周期
- 栈中数据的生命周期与其作用域有关,当变量离开作用域时会自动回收内存。
- 堆中数据的生命周期通常由程序员手动控制,通过GC进行自动回收
- 访问速度
- 栈中数据访问速度相对较快,因为栈是线性数据结构,数据的存储直接通过指针获取,无需查找。
- 堆中数据访问速度相对慢,因为数据的存储位置是分散的需要通过指针间接访问,且堆的管理需要一定的开销
- 分配方式
- 栈上的内存分配是静态的,编译器在分配前就知道大小
- 堆上的内存分配是动态的,需要在运行时根据需求进行分配
- 存储方式
- STW
- GC 更新过程
- 标记清除(Go版本 V1.3 之前)
- 三色标记法(Go版本 V1.5)
- 三色标记法+混合写屏障机制(Go版本 V1.8)