第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在Go中分配了大量的內(nèi)存。怎么修?

在Go中分配了大量的內(nèi)存。怎么修?

Go
烙印99 2023-06-26 15:14:52
為 50 個(gè) 5 MB 請(qǐng)求分配了數(shù)百 MB 內(nèi)存。內(nèi)存已分配且不再釋放。我怎樣才能清除我的記憶?為什么會(huì)發(fā)生這種情況?我在我的家用電腦和 VPS 上嘗試過(guò) 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貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超4個(gè)贊

您正在為每個(gè) go 例程創(chuàng)建一個(gè) http 客戶(hù)端。


Http 客戶(hù)端被設(shè)計(jì)為一次創(chuàng)建并多次使用。它們是日常安全的。它們?cè)试S連接重用和其他效率節(jié)省。


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


編輯:此外,雖然它可能不會(huì)對(duì)您的情況產(chǎn)生實(shí)際影響,但請(qǐng)求的順序通常如下所示:


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的垃圾收集不是即時(shí)的 - 也不應(yīng)該是 - 因?yàn)樗且豁?xiàng)昂貴的操作。如果您不再需要某個(gè)內(nèi)存塊 - 只需不再引用它即可。讓 GC 完成它的工作,這樣您就可以專(zhuān)注于您的工作!

查看完整回答
反對(duì) 回復(fù) 2023-06-26
?
素胚勾勒不出你

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊

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

? ? ? ? go func() {

? ? ? ? ? ? DoRequest()

? ? ? ? }()

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

? ? }

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

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

您可以通過(guò)乘以一次要運(yùn)行的 go 例程的 max-number 來(lái)預(yù)先計(jì)算最壞情況下要占用的內(nèi)存,并且 max-memory 可以被一個(gè) go 例程使用。

查看完整回答
反對(duì) 回復(fù) 2023-06-26
  • 2 回答
  • 0 關(guān)注
  • 187 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)