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 :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"

相关阅读:

Ubuntu 安装Go语言包

《Go语言编程》高清完整版电子书

Go语言并行之美 -- 超越 “Hello World”

我为什么喜欢Go语言

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/2f514c2b70c2480a729e8b1d32d7812c.html