使用一個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"