Go 語言的 HTTP 標準庫中的內(nèi)存泄漏問題?
使用一個go庫實現(xiàn)的一個http服務器:
- package main
- import (
- "net/http"
- )
- func main() {
- http.ListenAndServe(":8080", nil)
- }
它將使用大約850kb的內(nèi)存啟動.通過你的瀏覽器向它發(fā)送一些請求. 你會觀察到它(內(nèi)存的使用)迅速上升到1mb. 如果你等著,你會發(fā)現(xiàn)它從來不會降下來. 現(xiàn)在(使用下面的腳本)用 Apache Bench 動一下它,你會發(fā)現(xiàn)內(nèi)存使用仍然在增長. 一段時間過后它最終會維持在8.2mb左右
. Edit編輯: 看起來它并不會止步于8.2,而它的增長速度會顯著減慢。現(xiàn)在它處在9.2的水平,并且仍然在增長.
總之,為什么會發(fā)生這樣的事情呢?我使用了這段shell腳本一探究竟:
- while [ true ]
- do
- ab -n 1000 -c 100 http://127.0.0.1:8080/
- sleep 1
- end
然后嘗試獲得這個的底線, 我已經(jīng)嘗試過調(diào)整設置. 試過使用r.Close = true 來阻止 Keep-Alive. 沒有任何東西看起來是起作用的.
當我嘗試去判斷我正在編寫的程序是否存在內(nèi)存泄露時,我發(fā)現(xiàn)了這個問題的來由. 它有大量的http處理器和I/O調(diào)用. 檢查過后我已經(jīng)關閉了我所有的數(shù)據(jù)庫鏈接,我繼續(xù)觀察,仍然會看到內(nèi)存使用繼續(xù)上升. 我的程序內(nèi)存使用會維持在 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
譯文鏈接:http://www.oschina.net/translate/memory-leak-in-go-http-standard-library