- go语言中内存被分成几份区域,其中包括栈和堆,栈主要用于存储函数的局部变量和其他信息,他的大小在程序运行期间是固定的。堆用于存储动态分配的对象,进程中的所有线程共享一个堆区,所以需要考虑线程安全问题。
- 堆和栈的区别
- 存储方式
- 栈是线性数据结构、采用先进后出的方式存储数据。栈通常用于存储函数的局部变量、函数的参数,栈上的存储空间是有限且固定的,由编译器和操作系统控制。
- 堆是树型数据结构,用于动态分配和管理内存,堆内存的大小根据需要动态调整,通常比栈大,用于存储复杂的数据结构
- 生命周期
- 栈中数据的生命周期与其作用域有关,当变量离开作用域时会自动回收内存。
- 堆中数据的生命周期通常有程序员自己控制
- 访问速度
- 栈中数据访问速度相对较快,因为栈是线性数据结构,内存分配是连续的。
- 堆中数据访问速度相对慢,因为内存分配是随机的,且堆的管理需要一定的开销。
- 为什么连续的内存分配访问速度快
访问数据时先检查缓存中是否存在,如果不存在则在内存中查找数据。连续内存分配可以提高缓存的命中率,有效的利用缓存,随机分配的内存缓存利用率低,所以栈比堆访问速度快
- 分配方式
- 栈上的内存分配是静态的,编译器在分配前就知道大小
- 堆上的内存分配是动态的,需要在运行时根据需求进行分配
- 内存逃逸
- 目的:用于用于决定内存存放到栈中还是堆中
- 内存逃逸判断条件:
- 如果函数外部没有引用则分配到栈中
- 如果函数外部有引用则分配到堆中
- 如果栈上放不下,则放到堆中
- 只要是指针变量都会在堆上分配,所以对于小变量我们还是传值效率(而不是指针)更高一点
- 查看逃逸情况命令 go build -gcflags=-m main.go
- STW
- GC 更新过程
- 标记清除(Go版本 V1.3 之前)
- 三色标记法(Go版本 V1.5)
- 三色标记法+混合写屏障机制(Go版本 V1.8)
posted @
2024-09-03 13:45
你看起来真的很好吃
阅读(
8)
评论()
编辑
收藏
举报