登录
首页 >  Golang >  Go问答

ticker.C是否会导致内存泄漏?

来源:stackoverflow

时间:2024-03-02 11:45:24 450浏览 收藏

怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《ticker.C是否会导致内存泄漏?》,涉及到,有需要的可以收藏一下

问题内容

我在堆栈溢出中搜索了与此类似的内容,但找不到我正在寻找的内容。如果这是一个明显的错误,我深表歉意,因为我最近才开始用 go 写作,但我很感谢任何提前的解释。 我目前有一个 go 例程,其范围为 *ticker 的值。 现在,这个 go 例程在我的程序存活期间一直运行,因为它检查必要的更新。我开始意识到我的程序随着时间的推移会慢慢泄漏内存。运行 20 到 30 小时后,它开始变得非常明显。

func (s *server) checkforupdates() { // go routine
    ticker := time.newticker(time.minute * time.duration(s.checktime)) //x.checktime = 2 minutes
    defer ticker.stop()
    for t := range ticker.c { // will loop every 2 minutes
         fmt.println("the update check happened at %d\n", t)
         // do the updates
    }
}

我将泄漏范围缩小到了 go 例程,并仔细阅读了所有 time 可能泄漏内存的方法。确保在完成 go 例程后关闭您创建的 *ticker。然而,我的程序会永远运行,直到我杀死它。所以这个 go 例程将永远运行,直到我决定停止该程序。 我知道这样想可能很愚蠢,但我认为问题可能出在 t := rangeticker.c 部分。因为这个循环永远不会停止,直到我杀人为止。所以 t 永远不会被释放。所以我认为 := 每次循环时都会重新声明变量?然后我循环:

for _ = range ticker.C { // completely got rid of declaration of time.Time
   // do updates ...
}

到目前为止,它似乎有效......但我真的不明白为什么,或者也许它应该没有帮助,而且我还做错了其他事情。

我很感谢对此的任何帮助/解释。谢谢。


解决方案


正如 @cerise limon 指出的那样,您的应用程序很可能在其执行的逻辑中泄漏内存。为了准确查明内存泄漏的原因,您可以使用 pprof 显示语句使用的总内存。这是回答任何问题的方法,例如:

  • “应用程序的哪一部分在某个时间点使用的内存最多?”
  • “应用程序的哪一部分负责最多的内存分配?(以字节大小为单位)”
  • “应用程序的哪一部分(如果有)随着时间的推移而变得越来越大”
  • “给定语句/行在某个时间点使用了多少内存?”

启用 pprof 后,您可以使用以下方法获取内存配置文件:

$ curl http://localhost:8080/debug/pprof/heap > heap.0.pprof

然后您可以使用 cli 与配置文件进行交互:

$ go tool pprof pprof/heap.3.pprof
Local symbolization failed for main: open /tmp/go-build598947513/b001/exe/main: no such file or directory
Some binary filenames not available. Symbolization may be incomplete.
Try setting PPROF_BINARY_PATH to the search path for local binaries.
File: main
Type: inuse_space
Time: Jul 30, 2018 at 6:11pm (UTC)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof) svg
Generating report in profile002.svg
(pprof) top20
Showing nodes accounting for 410.75MB, 99.03% of 414.77MB total
Dropped 10 nodes (cum <= 2.07MB)
      flat  flat%   sum%        cum   cum%
  408.97MB 98.60% 98.60%   408.97MB 98.60%  bytes.Repeat
    1.28MB  0.31% 98.91%   410.25MB 98.91%  main.(*RequestTracker).Track
    0.50MB  0.12% 99.03%   414.26MB 99.88%  net/http.(*conn).serve
         0     0% 99.03%   410.25MB 98.91%  main.main.func1
         0     0% 99.03%   410.25MB 98.91%  net/http.(*ServeMux).ServeHTTP
         0     0% 99.03%   410.25MB 98.91%  net/http.HandlerFunc.ServeHTTP

这将显示您的应用程序中使用了多少内存以及哪些语句/行负责。

同样酷的是,您可以生成程序的 graphviz 图表,以便可视化和跟踪当前内存使用情况(或内存分配):

网上有很多关于 pprof 的博客文章(包括标准文档)。

我写了一些相关内容:

还有许多令人惊叹的资源,其中两个是:

理论要掌握,实操不能落!以上关于《ticker.C是否会导致内存泄漏?》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>