😥 整理不易,此资源只针对正式星主开放,
还请入驻星球后再来观看。

GOLANG ROADMAP

阅读模式

  • 沉浸
  • 自动
  • 日常
首页
Go学习
  • Go学院

    • Go小课
    • Go小考
    • Go实战
    • 精品课
  • Go宝典

    • 在线宝典
    • B站精选
    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
  • Go下载

    • 视频资源
    • 文档资源
Go求职
  • 求职服务

    • 内推互助
    • 求职助力
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
Go友会
  • 城市
  • 校园
推广返利 🤑
实验区
  • Go周边
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
author-avatar

GOLANG ROADMAP


首页
Go学习
  • Go学院

    • Go小课
    • Go小考
    • Go实战
    • 精品课
  • Go宝典

    • 在线宝典
    • B站精选
    • 推荐图书
    • 精品博文
  • Go开源

    • Go仓库
    • Go月刊
  • Go下载

    • 视频资源
    • 文档资源
Go求职
  • 求职服务

    • 内推互助
    • 求职助力
  • 求职刷题

    • 企业题库
    • 面试宝典
    • 求职面经
Go友会
  • 城市
  • 校园
推广返利 🤑
实验区
  • Go周边
消息
更多
  • 用户中心

    • 我的信息
    • 推广返利
  • 玩转星球

    • 星球介绍
    • 角色体系
    • 星主权益
  • 支持与服务

    • 联系星主
    • 成长记录
    • 常见问题
    • 吐槽专区
  • 合作交流

    • 渠道合作
    • 课程入驻
    • 友情链接
  • Go真实面试题汇总系列

    • 《内存管理篇》
  • 宝典内容

    • 24. go垃圾回收,什么时候触发
    • 40. go的GC(标记清理 -> 三色标记发 -> 混合写屏障)
    • 43. Golang 逃逸分析
    • 57. 内存模型
    • 128. GC 触发机制是什么样的
    • 163. Go 语言什么时候垃圾回收,写代码的时候如何减少对象分配
    • 164. golang GC
    • 182. 一个对象数组,不用delete[] 使用delete有什么影响
    • 183. go 内存分配,和 tcmalloc 的区别?
    • 191. Golang 内存分配的实现?
    • 192. Golang 里怎么避免内存逃逸?
    • 212. 了解过Go的内存管理吗
    • 252. 垃圾回收 相比程序员直接 free 和 delete 之类的,有什么优化(内存碎片)
    • 257. Golang和Java的垃圾回收机制
    • 315.GO的垃圾回收?Java的垃圾回收?Python的垃圾回收
    • 325. go 内存分配
    • 334. golang的gc流程,会stw吗,三色不变和混合写屏障
    • 338. Go 语言内存分配,什么分配在堆上,什么分配在栈上
    • 339. 简单介绍一下go的内存分配机制?有mcentral为啥要mcache?
    • 354. go的GC和Python的GC
    • 369. 简单介绍一下go的内存分配机制?有mcentral为啥要mcache?
    • 370. go性能调优怎么做的?
    • 399. go中的指针强转
    • 441. go语言的时候垃圾回收,写代码的时候如何减少小对象分配
    • 456. 虚拟内存有什么作用 (无效,属于操作系统)

😥 整理不易,此资源只针对正式星主开放,
还请入驻星球后再来观看。

192. Golang 里怎么避免内存逃逸?


企业题库解析小组

题目序号:2880

题目来源:蚂蚁

频次:3

# 答案:陆户习习门

  1. 不要盲目使用变量指针作为参数,虽然减少了复制,但变量逃逸的开销更大。
  2. 预先设定好slice长度,避免频繁超出容量,重新分配。
  3. 一个经验是,指针指向的数据大部分在堆上分配的,请注意。

出现内存逃逸的情况有:

1.发送指针或带有指针的值到channel,因为编译时候无法知道那个goroutine会在channel接受数据,编译器无法知道什么时候释放。

2.在一个切片上存储指针或带指针的值。比如[]*string,导致切片内容逃逸,其引用值一直在堆上。

3.切片的append导致超出容量,切片重新分配地址,切片背后的存储基于运行时的数据进行扩充,就会在堆上分配。

4.调用接口类型时,接口类型的方法调用是动态调度,实际使用的具体实现只能在运行时确定,如一个接口类型为io.Reader的变量r,对r.Read(b)的调用将导致r的值和字节片b的后续转义并因此分配到堆上。

5.在方法内把局部变量指针返回,被外部引用,其生命周期大于栈,导致内存溢出。

  • 答案:陆户习习门