我收到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)
}
Run Code Online (Sandbox Code Playgroud)
我注意到使用的类型是bytes.Buffer,这种类型具有Reset()和Truncate()函数,但它们都不允许释放曾经占用的内存.
该文档的Reset()状态如下:
重置将缓冲区重置为空,但它会保留底层存储以供将来的写入使用.重置与截断(0)相同.
如何取消缓冲区并再次释放内存?我的程序在运行期间需要大约50MB的内存,需要2小时.当我导入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 …Run Code Online (Sandbox Code Playgroud) 作为Windows用户,我知道操作系统线程占用大约1 Mb的内存,因为如果OS线程更加贪婪,每个内存By default, Windows allocates 1 MB of memory for each thread’s user-mode stack.如何golang使用~8kb的内存goroutine.是goroutine那种虚拟线程的?