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