如何理解Go语言的HTTP标准库中的内存泄漏问题
这篇文章给大家介绍如何理解Go语言的HTTP标准库中的内存泄漏问题,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
目前成都创新互联已为上千余家的企业提供了网站建设、域名、网页空间、网站运营、企业网站设计、岫岩网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
使用一个go库实现的一个http服务器:
package main import ( "net/http" ) func main() { http.ListenAndServe(":8080", nil) }
它将使用大约850kb的内存启动.通过你的浏览器向它发送一些请求. 你会观察到它(内存的使用)迅速上升到1mb. 如果你等着,你会发现它从来不会降下来. 现在(使用下面的脚本)用 Apache Bench 动一下它,你会发现内存使用仍然在增长. 一段时间过后它最终会维持在8.2mb左右
. Edit编辑: 看起来它并不会止步于8.2,而它的增长速度会显著减慢。现在它处在9.2的水平,并且仍然在增长.
总之,为什么会发生这样的事情呢?我使用了这段shell脚本一探究竟:
while [ true ] do ab -n 1000 -c 100 http://127.0.0.1:8080/ sleep 1 end
然后尝试获得这个的底线, 我已经尝试过调整设置. 试过使用r.Close = true 来阻止 Keep-Alive. 没有任何东西看起来是起作用的.
当我尝试去判断我正在编写的程序是否存在内存泄露时,我发现了这个问题的来由. 它有大量的http处理器和I/O调用. 检查过后我已经关闭了我所有的数据库链接,我继续观察,仍然会看到内存使用继续上升. 我的程序内存使用会维持在 433 MB 左右.
这里是 Goenv 的输出:
GOARCH="amd64" GOBIN="" GOCHAR="6" GOEXE="" GOHOSTARCH="amd64" GOHOSTOS="darwin" GOOS="darwin" GOPATH="/Users/mark/Documents/Programming/Go" GORACE="" GOROOT="/usr/local/go" GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64" TERM="dumb" CC="clang" GOGCCFLAGS="-g -O2 -fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fno-common" CXX="clang++" CGO_ENABLED="1"
关于如何理解Go语言的HTTP标准库中的内存泄漏问题就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
文章名称:如何理解Go语言的HTTP标准库中的内存泄漏问题
链接URL:http://azwzsj.com/article/ieiggs.html