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

Golang goroutine 内存泄漏

Golang goroutine 内存泄漏

Go
MMMHUHU 2021-12-07 10:34:32
我不明白为什么没有释放内存。内存配置文件显示几乎所有的内存都被runtime.malg 使用。如果我在 DoSomeWork 中删除通道范围,一切正常。这里是 fmt.Println 的输出:Memory Acquired:  4196600Memory Used    :  745192Memory Acquired:  2651299576Memory Used    :  393923440源代码:func DoSomeWork(work chan int) {    for _ = range work {    }}func main() {    k := make(chan int)    m := &runtime.MemStats{}    runtime.ReadMemStats(m)    fmt.Println("Memory Acquired: ", m.Sys)    fmt.Println("Memory Used    : ", m.Alloc)    wg := new(sync.WaitGroup)    // generate a lot of goroutines that reads from channel    for i:=0;i<1000000;i++ {        wg.Add(1)        go func() {            DoSomeWork(k)            wg.Done()        }()    }    close(k)    wg.Wait()    // make GC    runtime.GC()    // show memory after garbage collector    runtime.ReadMemStats(m)    fmt.Println("Memory Acquired: ", m.Sys)    fmt.Println("Memory Used    : ", m.Alloc)}
查看完整描述

1 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

您的代码中没有内存泄漏。但是,您确实会保留大量内存,这就是您所看到的。


当我寻找任何类型的泄漏时,我更喜欢进行多次测试。这很容易通过您的代码完成。只需添加:


func init(){

    for{

        main()

    }

}

新输出将显示在运行期间没有丢失内存:


Memory Acquired:  2885880

Memory Used    :  14848

Memory Acquired:  2594885728

Memory Used    :  297108312

Memory Acquired:  2594885728

Memory Used    :  297108984

Memory Acquired:  2624143456

Memory Used    :  297108312

Memory Acquired:  2624143456

Memory Used    :  297108984

Memory Acquired:  2624143456

Memory Used    :  297108312

Memory Acquired:  2624143456

Memory Used    :  297108984

Memory Acquired:  2624143456

Memory Used    :  297108312

Memory Acquired:  2624143456

Memory Used    :  297108984

Memory Acquired:  2624143456

Memory Used    :  297108312


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 214 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信