开源中国

我们不支持 IE 10 及以下版本浏览器

It appears you’re using an unsupported browser

为了获得更好的浏览体验,我们强烈建议您使用较新版本的 Chrome、 Firefox、 Safari 等,或者升级到最新版本的IE浏览器。 如果您使用的是 IE 11 或以上版本,请关闭“兼容性视图”。
Go 语言的 HTTP 标准库中的内存泄漏问题? - 技术翻译 - 开源中国社区

Go 语言的 HTTP 标准库中的内存泄漏问题? 【已翻译100%】

标签: Go
oschina 推荐于 4年前 (共 2 段, 翻译完成于 01-13) 评论 19
收藏  
29
推荐标签: Go 待读
参与翻译 (2人) : LeoXu, dij 仅中文 | 中英文对照 | 仅英文 | 打印此文章

使用一个go库实现的一个http服务器:

package main

import (
    "net/http"
)

func main() {
    http.ListenAndServe(":8080", nil)
}

它将使用大约850kb的内存启动.通过你的浏览器向它发送一些请求. 你会观察到它(内存的使用)迅速上升到1mb. 如果你等着,你会发现它从来不会降下来. 现在(使用下面的脚本)用 Apache Bench 动一下它,你会发现内存使用仍然在增长. 一段时间过后它最终会维持在8.2mb左右.

Edit编辑: 看起来它并不会止步于8.2,而它的增长速度会显著减慢。现在它处在9.2的水平,并且仍然在增长.

LeoXu
 翻译得不错哦!

总之,为什么会发生这样的事情呢?我使用了这段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"

该问题已有最佳答案,详情请看

http://stackoverflow.com/questions/21080642/memory-leak-in-go-http-standard-library

LeoXu
 翻译得不错哦!
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们
评论(19)
Ctrl/CMD+Enter

非常同意,用http写的模拟登录,内存跑的飞起
这是哪个版本的GO? 如果确实有内存泄漏,则比较麻烦,持续关注……
不明觉厉。
稳定在600多KB
持续关注。。。
这种文章应该说一下使用的版本吧
感觉像讲段子,接下来就是 “哦 原来代码是不应该这样写的 .......” 还是持续关注
关注~~
希望翻译的人在后面附上这个:http://stackoverflow.com/questions/21080642/memory-leak-in-go-http-standard-library
这个应该是go的早期版本吧,我有一个运行在windows下。go 1.2,一直稳定运行2个多月。内存在2m。
go1.2 测试了,保持2MB
原帖作者在瞎搞,他用了第三方的gorilla/sessions库,又不用相对应的router,才造成了内存泄漏。
更离奇的是还不告诉别人他用了第三方库,就怀疑是standard library有问题。
几十万次后 稳定到 3m多点

引用来自“akirakazu”的评论

原帖作者在瞎搞,他用了第三方的gorilla/sessions库,又不用相对应的router,才造成了内存泄漏。
更离奇的是还不告诉别人他用了第三方库,就怀疑是standard library有问题。

这就是所谓低级黑,标题党?
go version go1.2 linux/386 文章中的测试方法 增长至 5.2M 后保持不变。
真够扯淡的,这么明显的内存泄露,谷歌的大牛们会发现不了?

引用来自“羊半仙”的评论

引用来自“akirakazu”的评论

原帖作者在瞎搞,他用了第三方的gorilla/sessions库,又不用相对应的router,才造成了内存泄漏。
更离奇的是还不告诉别人他用了第三方库,就怀疑是standard library有问题。

这就是所谓低级黑,标题党?

oschina翻译他这帖,又不把评论翻译进来,这才是低级黑
一楼要是回头看下,会不会尴尬了?小伙伴们都说没问题啊
明显不过脑子的翻译,这种基本库如果有这么明显的问题,你当这么多人傻了吧
顶部