为了账号安全,请及时绑定邮箱和手机立即绑定

【金秋打卡】第1天 Go的内存模型

课程名称深入Go底层原理,重写Redis中间件实战

课程章节:9-1,9-2

课程讲师Moody

课程内容

★Go协程栈的作用

  • 协程的执行路径

    go的协程是在栈中依次执行的

  • 局部变量

    go的局部变量是存在栈中的,当然如果出现变量过大,或者指针传递给其他地方,可能会造成逃逸

  • 函数传参

    go的栈在依次执行的时候,一个函数传递给下一个函数的参数是在栈内存中完成的

    go使用的是参数拷贝传递(值传递)

    传递结构体时:会拷贝结构体中的全部内容,所以不推荐

    传递指针时:会拷贝结构体指针

  • 函数返回值

    同上,只不过相反方向

★逃逸分析

  • 不是所有的变量都放在协程栈上

  • 栈帧回收后,需要继续使用的变量不能被回收,会逃逸到堆上

  • 太大的变量是放不下的,栈帧初始只有2~4k,太大的变量也是会逃逸到堆上,超过64k的变量会被直接逃逸到堆上

  • 指针逃逸:函数返回了对象的指针,导致栈帧回收后,指针被其他函数使用

  • 空接口:空接口往往会被用于反射,反射通常是对堆中的变量进行反射,栈内存很难反射

★栈扩容

  • 在函数调用钱判断栈空间(morestruct)

  • 1.13之前用的是分段栈:分段栈类似于map的溢出桶,当栈帧空间不足的时候,就开辟一个新的栈区和之前的栈帧逻辑上连在一起,好处是没有空间浪费,缺点是会在新开辟的区域和 旧区域之间来回横跳

  • 1.13之后用的是连续栈:连续栈类似于分片,当需要扩容的时候,就直接找个新空间,新空间是旧空间的2倍,把旧数据全部迁移过来,然后舍弃旧栈区。缩容的时候,是当空间使用率不足四分之一,就缩容为原来的二分之一。连续栈的优点是:空间一直是连续的。缺点是伸缩的时候开销大。

课程收获:

通过学习,对go的内存模型有初步的认知,了解了go的内存的栈和堆其实都在系统分配的堆区上

https://img1.sycdn.imooc.com//6356d0b6000169fe18001015.jpg


点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消