歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Go 語言的 HTTP 標准庫中的內存洩漏問題?

Go 語言的 HTTP 標准庫中的內存洩漏問題?

日期:2017/3/1 9:49:14   编辑:Linux編程

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

Copyright © Linux教程網 All Rights Reserved