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

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

如何在golang中手動釋放內(nèi)存

如何在golang中手動釋放內(nèi)存

Go
梵蒂岡之花 2022-12-19 17:55:16
下面是計算 C(36,8) 并將結果保存到文件的代碼func combine_dfs(n int, k int) (ans [][]int) {    temp := []int{}    var dfs func(int)    dfs = func(cur int) {        if len(temp)+(n-cur+1) < k {            return        }        if len(temp) == k {            comb := make([]int, k)            copy(comb, temp)            ans = append(ans, comb)            return        }        temp = append(temp, cur)        dfs(cur + 1)        temp = temp[:len(temp)-1]        dfs(cur + 1)    }    dfs(1)    return}func DoCombin() {    fmt.Printf("%v\n", "calculator...")    cst := []byte{}    for i := 'a'; i <= 'z'; i++ {        cst = append(cst, byte(i))    }    for i := '0'; i <= '9'; i++ {        cst = append(cst, byte(i))    }    n := 36    k := 8    arr := combine_dfs(n, k)    fmt.Printf("%v\n", "writefile...")    file, _ := os.OpenFile("result.txt", os.O_CREATE|os.O_TRUNC|os.O_RDWR|os.O_APPEND, 0666)    defer file.Close()    for _, m := range arr {        b:= bytes.Buffer{}        b.Reset()        for _, i := range m {            b.WriteByte(cst[i-1])        }        b.WriteByte('\n')        file.Write(b.Bytes())    }}但是我寫文件太慢了..所以我想使用 goroutine 來寫文件(使用 pool 來限制 goroutine 的數(shù)量):func DoCombin2() {    fmt.Printf("%v\n", "calculator...")    cst := []byte{}    for i := 'a'; i <= 'z'; i++ {        cst = append(cst, byte(i))    }    for i := '0'; i <= '9'; i++ {        cst = append(cst, byte(i))    }    n := 36    k := 8    arr := combine_dfs(n, k)    fmt.Printf("%v\n", "writefile...")    file, _ := os.OpenFile("result.txt", os.O_CREATE|os.O_TRUNC|os.O_RDWR|os.O_APPEND, 0666)    defer file.Close()    pool := make(chan int, 100)    for _, m := range arr {        go func(m []int) {            pool <- 1            b := bytes.Buffer{}            b.Reset()            for _, i := range m {                b.WriteByte(cst[i-1])            }        }(m)    }}有什么辦法可以避免內(nèi)存爆炸?1.為什么使用了sync.Pool后還是無法避免?2.有什么方法可以限制 Windows 中的內(nèi)存使用(我知道在 Linux 中)?3.還有其他方法可以避免內(nèi)存爆炸嗎?4.內(nèi)存爆炸是因為bytes.Buffer嗎?如何手動釋放 bytes.Buffer?
查看完整描述

2 回答

?
溫溫醬

TA貢獻1752條經(jīng)驗 獲得超4個贊

根據(jù)此提案:arena:提供內(nèi)存 arenas 的新包

arena我們建議在 Go 標準庫中添加一個新包。arena 包將允許分配任意數(shù)量的競技場??梢詮母偧紙龅膬?nèi)存中分配任意類型的對象,并且競技場的大小會根據(jù)需要自動增長。當 arena 中的所有對象都不再使用時,可以顯式釋放 arena 以有效地回收其內(nèi)存,而無需進行一般的垃圾收集。我們要求實施提供安全檢查,這樣,如果無競技場的操作不安全,程序將在任何不正確的行為發(fā)生之前終止。

該功能已經(jīng)合并到arena下的 master 分支,可能會在 go 1.20 中發(fā)布。使用該arena包,您可以自己分配內(nèi)存,如果不再使用則手動釋放它。

示例代碼

 a := arena.NewArena()

    defer a.Free()


    tt := arena.New[T1](a)

    tt.n = 1


    ts := arena.MakeSlice[T1](a, 99, 100)

    if len(ts) != 99 {

        t.Errorf("Slice() len = %d, want 99", len(ts))

    }

    if cap(ts) != 100 {

        t.Errorf("Slice() cap = %d, want 100", cap(ts))

    }

    ts[1].n = 42


查看完整回答
反對 回復 2022-12-19
?
慕雪6442864

TA貢獻1812條經(jīng)驗 獲得超5個贊

在 1.19 中

垃圾收集器增加了對軟內(nèi)存限制的支持,

垃圾收集器添加了對軟內(nèi)存限制的支持,在新的垃圾收集指南中有詳細討論。該限制對于優(yōu)化 Go 程序以在具有專用內(nèi)存量的容器中盡可能高效地運行特別有用。

新的垃圾收集指南


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

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