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

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

如何將內存返回給操作系統

如何將內存返回給操作系統

Go
慕工程0101907 2022-06-06 15:24:44
我的程序從操作系統獲取內存但沒有返回。它讀取內存中的文件,處理它們,然后等待下一個文件。一般來說,我有小文件,但有時我有大文件。當我的程序處理大文件時,它會向操作系統請求大量內存,但不會將其返回。我找到了與 using 相關的問題/答案debug.FreeOSMemory(),但它不適用于我的代碼示例。我在真實系統中遇到了問題,但我可以在一個小例子中重現它: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)    }}當然,我在實際應用中不會調用 GC。我在這里用它來演示我的問題。如果理解正確:程序從堆中分配內存。Go 運行時第一次沒有足夠的內存并從操作系統請求它。我調用 GC,它從內存中釋放對象。但是 Go 運行時不會將此內存返回給操作系統。這對我來說是個問題,因為程序獲取了大文件,獲取了大量內存,并且在 OOM 殺手殺死程序的一個實例之前(幾天)永遠不會將其返回給操作系統。為什么 Go 運行時不會將此內存返回給操作系統,我該如何解決?
查看完整描述

2 回答

?
慕容708150

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

Go 返回內存,但要經過一段時間。未使用的內存幾乎從來都不是問題。



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

TA貢獻1798條經驗 獲得超3個贊

為什么 Go 運行時不會將此內存返回給操作系統

它返回此內存,但不會立即返回,因為分配/返回內存是一項昂貴的操作。如果你等不及...

我該如何解決?

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


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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