小编典典

一旦被字节占用就无法释放内存

go

我收到compressedbytes[]
byte类型的压缩ASCII文本字节。我面临的问题是,以下过程占用了很多内存,这些内存在函数到达其末尾后仍未释放,并在程序的整个运行期间保持占用状态。

    b := bytes.NewReader(compressedbytes)
    r, err := zlib.NewReader(b)
    if err != nil {
        panic(err)
    }
    cleartext, err = ioutil.ReadAll(r)
    if err != nil {
        panic(err)
    }

我注意到正在使用的类型是bytes.Buffer并且此类型具有Reset()Truncate()函数,但是它们都不允许释放曾经占用的内存。

文档Reset()状态如下:

重置会将缓冲区重置为空,但会保留基础存储以供将来的写操作使用。重置与Truncate(0)相同。

如何取消设置缓冲区并再次释放内存?我的程序在运行2小时的过程中需要大约50MB的内存。当我导入zlib压缩的字符串时,程序需要200 MB的内存。

谢谢你的帮助。

===更新

我什至为解压缩创建了一个单独的函数,并runtime.GC()在程序从该函数返回失败后手动调用垃圾收集器。

// unpack decompresses zlib compressed bytes
func unpack(packedData []byte) []byte {
    b := bytes.NewReader(packedData)
    r, err := zlib.NewReader(b)
    if err != nil {
        panic(err)
    }
    cleartext, err := ioutil.ReadAll(r)
    if err != nil {
        panic(err)
    }
    r.Close()
    return cleartext
}

阅读 84

收藏
2020-07-02

共1个答案: 请登录查看