当前位置: 首页 > news >正文

golang 内存管理

对象池

  • 在每次开始执行垃圾回收时,都会清除所有已创建的临时对象池中的值
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 一个固定大小,不会被GC的内存池
    • 主要优势是不会被GC。缺点是少了收缩性,设置大了浪费内存,设置小了复用作用不明显
    • 适用于能够提前预估池子大小的场景
      • 在实践中,我们将其用在DB序列化层,其Worker数量固定,单个[]byte较大,也相对稳定

堆栈(逃逸分析)

  • Go 有两个地方可以分配内存:
    • 全局堆空间用来动态分配内存
    • 每个 goroutine 都有的自身空间
  • Go 更倾向于在栈空间上分配内存,因为它的代价更低
    • 只需要两个 CPU 指令:一个是把数据 push 到栈空间上以完成分配,另一个是从栈空间上释放
    • malloc(堆分配)必须找到一块足够大的内存来存放新的变量数据,后续垃圾回收器还需要扫描堆空间寻找不再被使用的对象
  • 在栈上分配要求一个变量的生命周期和内存足迹能在编译时确定,否则就需要在运行时在堆空间上进行动态分配
    • 编译器使用逃逸分析来在这两者间做选择
    • 编译器会追踪变量在代码块上的作用域,如果它的整个生命周期是否在运行时完全可知,它就可以在栈上分配。否则就说它逃逸了,必须在堆上分配
  • 逃逸到堆上的典型情况
    • 函数返回变量地址,或返回包含变量地址的struct
    • 发送指针或带有指针的值到 channelsync.Pool
      • 编译时没有办法知道哪个 goroutine 会在 channel 上接收数据,所以编译器没法知道变量什么时候才会被释放
    • 在切片上存储指针或带指针的值,例如 []*string
      • 这会导致切片的内容逃逸,尽管数组可能是在栈上分配的,但其引用的值一定是在堆上
    • 在 interface 类型上调用方法
      • 在 interface 类型上调用方法都是动态调度的, 方法的真正实现只能在运行时知道
    • 闭包也可能导致闭包上下文逃逸
    • slice变量超过cap重新分配时,将在堆上进行
    • 将变量地址赋给可扩容容器(如map,slice)时
      在这里插入图片描述

内存分配

在这里插入图片描述
在这里插入图片描述

指针

  • 指针指向的数据都是在堆上分配的
    • 在程序中减少指针的运用可以减少堆分配
  • 有时直接的值拷贝要比使用指针廉价的多
    在这里插入图片描述
  • 不要掉进过早优化的陷阱,养成一个按值传递的习惯,只在需要的时候用指针传递
    • 一个好处就是可以较少 nil 带来的安全问题
    • 另一个好处是如果可以证明它里面没有指针,垃圾回收器会直接越过这块内存
      • 例如一块作为 []byte 背后存储的堆上内存,是不需要进行扫描的
    • 减少指针的使用不仅可以降低垃圾回收的工作量,还能产生对 cache 更加友好的代码
      • 要把数据从主内存读到 CPU 的 cache 中,由此产生的 cache 抖动会引起线上服务的一些意外的和突然的抖动

内联

  • 对Interface的方法调用不能被内联
    • 直接用Struct,借助于内联,字段访问会快一个数量级
  • 过于激进的内联会导致生成的二进制文件更大,CPU instruction cache miss也可能会增加
  • 内联可以减少逃逸到堆上的情况
    • 否则即使是简单函数,只要返回指针都会逃逸

参考

  • https://mp.weixin.qq.com/s?__biz=Mzg2MDU1Mjc3MQ==&mid=2247489727&idx=1&sn=6191494e579eff35afdecf4bffc93fd6&source=41#wechat_redirect
  • https://wudaijun.com/2019/09/go-performance-optimization/
http://www.jsqmd.com/news/31904/

相关文章:

  • 2025年比较好的耐压金属软管由壬厂家最新TOP推荐榜
  • 2025年挤出机冷却塔厂家权威推荐榜单:中频炉冷却塔/吹瓶机冷却塔/注塑机冷却塔源头厂家精选
  • 2025年热门的帆布布袋定制厂家最新权威推荐榜
  • 2025 年轻质抹灰石膏厂家最新推荐榜,技术实力与市场口碑深度解析,筛选高性能优质品牌找平 / 多立特 / 抗裂 / 隔音轻质抹灰石膏公司推荐
  • 2025 年 11 月微通道换热器厂家推荐排行榜,微通道蒸发器,微通道换热器,微通道换热器厂家最新推荐
  • VisualStadio2019 社区版下载
  • 红外
  • 2025年优秀的建筑业体系认证服务商实力排行
  • 筑牢安全基座——国产制品库如何重塑企业软件供应链防线?
  • C++23的out_ptr和inout_ptr
  • 2025年服务贴心的离婚财产分割律师实力推荐榜
  • 2025年口碑好的陕西白水苹果精选优质产区
  • 2025年专业的专利评估顶尖服务推荐
  • P1315 [NOIP 2011 提高组] 观光公交
  • 2025年11月销量第一认证机构评测:资质认证与实战案例深度剖析
  • 最近笔记
  • CH5xx 复位启动时间
  • 2025年质量好的马靴劳保鞋推荐TOP品牌厂家
  • 2025年知名的青年鸡热门品牌
  • 等离子清洗机设备:安全性高、技术强、外观美观
  • 红楼梦龄官病死前和贾蔷同居的情节
  • 2025年口碑好的盐城短视频策划精选优质榜
  • 2025年江西出入口智能设备企业口碑TOP5推荐,江西奇仕盾科技有限公司
  • 2025年老人/青少年/成人乳胶枕品牌排行榜,哪个乳胶枕品牌的质量好?
  • 2025年工业探伤铅房厂家权威推荐榜单:探伤铅房/移动铅房/牙科铅房源头厂家精选
  • 2025年有实力涂装喷砂房厂家推荐及选择指南
  • 跳石头:求最大的最短距离(p2678)
  • day22-streamlit+agent sdk融合
  • 格式化 U 盘,并还原分区
  • 2025 年景观设计公司最新推荐榜:聚焦全流程服务与创新实力,庭院 / 民宿 / 生态园等场景优选品牌清单