请问如何即时清除变量内存

yleoer · 2021-03-08 17:56:04 · 2651 次点击

go1.16.linux-amd64下经实测内存会很快回收,最慢也不过2分钟

#4
更多评论

你为什么要即时清除这块区域呢?

#1

回答问题:没有办法立即释放slice占用的内存。因为go的GC没有使用引用计数的机制,所以即使tmp=nil也是不行的。

如何优化:我们进入到这个场景中来,这里有一个API,每次请求它时都要创建一个slice,并往里面存放可预估长度的大量的数据。这些数据是一次性的,用完丢弃。但是每次请求时所需的slice空间基本是相等的。 所以,这里我们需要构建一个临时的内存池,即1个可复用的slice。上代码

package main

import (
    "net/http"
    "testing"
)

var tmp = make([]int, 0, 32*1000000)

func f() {
    println("enter...")
    for i := 0; i < 32*1000000; i++ {
        tmp = append(tmp, i)
    }
    tmp = tmp[:0]
    println("done")
}

func ff(w http.ResponseWriter, r *http.Request) {
    f()
}

func TestSlice(t *testing.T) {
    http.HandleFunc("/x", ff)
    panic(http.ListenAndServe(":1001", nil))
}

这样就可以使内存占用稳定在一个指标;避免了每请求1次,内存占用就累加1次,从而造成严重的内存泄露事件。

#2