开发者

Golang timer可能造成的内存泄漏问题分析

目录
  • golang timer可能造成的内存泄漏
    • 背景
    • 接下来进入正题
  • 总结

    Golang timer可能造成的内存泄漏

    背景

    前两天,跟一位学长交流Golang;然后,他突然问我:你知道timer可能造成内存泄漏嘛?

    当时,甚是一脸懵逼,毕竟之前写的Agent测了好久,都没发现这个问题啊。

    今天,就索性了解了下编程客栈

    这里先说下结论:

    • timer的误用可能造成某些等待timer的Goroutine无法正常退出,导致资源无法释放;
    • (ps. 虽然的确算是内存泄漏,但是对于我这种写C出身的人来说,感觉还是怪怪的)

    接下来进入正题

    让我们先看一段代码;

    这段代码的意图是,协程在timer.Stop()调用后能够继续执行从而退出;

    但是,实际的效果呢? 我们没有看到任何输出提示;

    那是为什么呢?

    这当中核心的原因就是,timer.Stop() 这个接口从设计的时候就设计成了并不去关闭Channel

    既然不关闭Chan,那么本例中的协程也就无法继续执行,从而退出了;

    package main
    
    import (
        "time"
        "fmt"
    )
    
    func main() {
        timer := time.NewTimer(3 * time.Second)
    
        go func() {
            <-timer.C
            fmt.Printljavascriptn("Timer has expired.")
        }()
    
        timer.Stop()
        time.Sleep(60 * time.Second)
    }

    作为一种修复手段:

    package main
    
    import (
        "timeandroid"
        "fmt"
    )
    
    
    func main()GxQcIzXprn {
        timer := time.NewTimer(3 * time.Second)
    
        go func() {
            <-timer.C
            fmt.Pri编程客栈ntln("Timer has expired.")
        }()
    
        //timer.Stop()
        timer.Reset(0  * time.Second)
        time.Sleep(60 * time.Second)
    }

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜