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

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

如何將內(nèi)存返回給操作系統(tǒng)

如何將內(nèi)存返回給操作系統(tǒng)

Go
慕工程0101907 2022-06-06 15:24:44
我的程序從操作系統(tǒng)獲取內(nèi)存但沒有返回。它讀取內(nèi)存中的文件,處理它們,然后等待下一個(gè)文件。一般來說,我有小文件,但有時(shí)我有大文件。當(dāng)我的程序處理大文件時(shí),它會(huì)向操作系統(tǒng)請求大量內(nèi)存,但不會(huì)將其返回。我找到了與 using 相關(guān)的問題/答案debug.FreeOSMemory(),但它不適用于我的代碼示例。我在真實(shí)系統(tǒng)中遇到了問題,但我可以在一個(gè)小例子中重現(xiàn)它:package mainimport (    "fmt"    "math/rand"    "runtime"    "runtime/debug")type Data struct {    a int    b int    c string}var letters = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")func randSeq(n int) string {    b := make([]rune, n)    for i := range b {        b[i] = letters[rand.Intn(len(letters))]    }    return string(b)}func stat(description string) {    var rtm runtime.MemStats    runtime.ReadMemStats(&rtm)    fmt.Printf("%s -> Alloc: %d; Sys: %d\n", description, rtm.Alloc, rtm.Sys)}func mapAllocate() map[string]Data {    var data = make(map[string]Data)    for i := 0; i < 10000; i++ {        key := randSeq(100)        el := Data{            a: rand.Int(),            b: rand.Int(),            c: randSeq(rand.Intn(10000)),        }        data[key] = el    }    return data}func main() {    stat("Start program")    var result map[string]Data    for i := 0; i < 10; i++ {        result = mapAllocate()        stat("Map allocate")        result = make(map[string]Data)        runtime.GC()        debug.FreeOSMemory()        stat("GC call     ")    }    fmt.Println(len(result))    runtime.GC()    debug.FreeOSMemory()    for true {       stat("Waiting     ")       time.Sleep(30 * time.Second)    }}當(dāng)然,我在實(shí)際應(yīng)用中不會(huì)調(diào)用 GC。我在這里用它來演示我的問題。如果理解正確:程序從堆中分配內(nèi)存。Go 運(yùn)行時(shí)第一次沒有足夠的內(nèi)存并從操作系統(tǒng)請求它。我調(diào)用 GC,它從內(nèi)存中釋放對象。但是 Go 運(yùn)行時(shí)不會(huì)將此內(nèi)存返回給操作系統(tǒng)。這對我來說是個(gè)問題,因?yàn)槌绦颢@取了大文件,獲取了大量內(nèi)存,并且在 OOM 殺手殺死程序的一個(gè)實(shí)例之前(幾天)永遠(yuǎn)不會(huì)將其返回給操作系統(tǒng)。為什么 Go 運(yùn)行時(shí)不會(huì)將此內(nèi)存返回給操作系統(tǒng),我該如何解決?
查看完整描述

2 回答

?
慕容708150

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

Go 返回內(nèi)存,但要經(jīng)過一段時(shí)間。未使用的內(nèi)存幾乎從來都不是問題。



查看完整回答
反對 回復(fù) 2022-06-06
?
呼如林

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

為什么 Go 運(yùn)行時(shí)不會(huì)將此內(nèi)存返回給操作系統(tǒng)

它返回此內(nèi)存,但不會(huì)立即返回,因?yàn)榉峙?返回內(nèi)存是一項(xiàng)昂貴的操作。如果你等不及...

我該如何解決?

runtime/debug.FreeOSMemory如果這確實(shí)是問題,您可以嘗試。


查看完整回答
反對 回復(fù) 2022-06-06
  • 2 回答
  • 0 關(guān)注
  • 161 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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