亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在Go中分配了大量的內存。怎么修?

在Go中分配了大量的內存。怎么修?

Go
烙印99 2023-06-26 15:14:52
為 50 個 5 MB 請求分配了數百 MB 內存。內存已分配且不再釋放。我怎樣才能清除我的記憶?為什么會發生這種情況?我在我的家用電腦和 VPS 上嘗試過 Ubuntupackage mainimport (    "fmt"    "io/ioutil"    "net/http"    "time")func main() {    fmt.Println("start")    for i := 0; i < 50; i++ {        go func() {            DoRequest()        }()        time.Sleep(10 * time.Millisecond)    }    time.Sleep(10 * time.Minute)}func DoRequest() error {    requestUrl := "https://blockchain.info/rawblock/0000000000000000000eebedea046425bd54626e6c56eb032e66e714d0141ea6"    req, err := http.NewRequest("GET", requestUrl, nil)    if err != nil {        return err    }    req.Header.Set("user-agent", "free")    httpClient := &http.Client{        Timeout: time.Second * 10,    }    resp, err := httpClient.Do(req)    if resp != nil {        defer resp.Body.Close()    }    if err != nil {        return err    }    body, err := ioutil.ReadAll(resp.Body)    if err != nil {        return err    }    fmt.Println("bodylen", len(body))    return nil}某處分配400MB
查看完整描述

2 回答

?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

您正在為每個 go 例程創建一個 http 客戶端。


Http 客戶端被設計為一次創建并多次使用。它們是日常安全的。它們允許連接重用和其他效率節省。


在 main 中(而不是在您的 go 例程中)創建一次 http 客戶端,然后將此單個引用傳遞給您的所有 50 個 go 例程。


編輯:此外,雖然它可能不會對您的情況產生實際影響,但請求的順序通常如下所示:


resp, err := httpClient.Do(req)

if err != nil {

? ? ? ? return err // check error first

}

defer resp.Body.Close() // no error - so resp will *NOT* be nil - so this is safe

編輯2:正如@Adrian所提到的:go的垃圾收集不是即時的 - 也不應該是 - 因為它是一項昂貴的操作。如果您不再需要某個內存塊 - 只需不再引用它即可。讓 GC 完成它的工作,這樣您就可以專注于您的工作!

查看完整回答
反對 回復 2023-06-26
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

?for i := 0; i < 50; i++ {

? ? ? ? go func() {

? ? ? ? ? ? DoRequest()

? ? ? ? }()

? ? ? ? time.Sleep(10 * time.Millisecond)

? ? }

切勿創建這樣的 go 例程。始終確保您創建 go 例程的方式在任何情況下(包括最壞的情況)都不會填充大量(所有)內存

簡單的解決方案是控制一次可以生成(或運行)的 go 例程的數量。

您可以通過乘以一次要運行的 go 例程的 max-number 來預先計算最壞情況下要占用的內存,并且 max-memory 可以被一個 go 例程使用。

查看完整回答
反對 回復 2023-06-26
  • 2 回答
  • 0 關注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號