golang的内存泄漏分析

我是不会赢的 · · 560 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

golang的内存泄漏分析

什么是内存泄漏

内存泄漏说白了就是分配的内存(或者变量)不再使用,但是并没有被gc回收,而是继续占用内存

内存泄漏场景

substring

  • 案例

    var s0 string // 包级别变量
    // A demo purpose function.
    func f(s1 string) {
      s0 = s1[:50]
      //s0 和 s1 共用相同的底层memory block
      // 尽管 s1 不再使用,但是 s0仍然存活状态
      // 所以s1 的内存不会被回收,尽管只有 50 byte内存
      // 被使用,但是其他内存都泄漏了。
    }
    func demo() {
      s := createStringWithLengthOnHeap(1 << 20) // 1M bytes
      f(s)
    }
    //可以用如下方式来避免
    func f(s1 string) {
      s0 = string([]byte(s1[:50]))
    }
    

卡住的或没结束的goroutine

没用且没stop的定时器

time.Ticker 应该被stop,当不再使用时候

io读写流未close

  • 案例

    func main() {
     num := 6
     for index := 0; index < num; index++ {
          resp, _ := http.Get("https://www.baidu.com")
          _, _ = ioutil.ReadAll(resp.Body)
     }
     fmt.Printf("此时goroutine个数= %d\n", runtime.NumGoroutine())
    }
    

    没有执行resp.Body.Close(),内存是肯定会泄漏,而且一共泄漏三个goroutine,一读一写一主(main)


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:我是不会赢的

查看原文:golang的内存泄漏分析

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

560 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传