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

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

Reset()的文档规定以下内容:

Reset resets the buffer to be empty, but it retains the underlying storage for use by future writes. Reset is the same as Truncate(0).

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

谢谢你的帮助。

===更新

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


一些事情要清除。 Go是一种垃圾回收语言,这意味着当这些变量变得不可访问时(如果您有另一个指向该变量的指针,则仍视为"可访问"),垃圾回收器会自动释放变量分配和使用的内存。

释放的内存并不意味着将其返回给操作系统。释放的内存意味着可以回收该内存,并在需要时将其重新用于另一个变量。因此,从操作系统中,您不会仅由于某些变量变得不可访问而垃圾回收器检测到此变量并释放了它所使用的内存,就不会立即看到内存减少。

但是,如果Go运行时一段时间(通常约5分钟)不使用,它将把内存返回给OS。如果在此期间内存使用量增加(并且有选择地再次缩小),则很有可能不会将内存返回给操作系统。

如果您等待一段时间而不重新分配内存,则释放的内存最终将返回给操作系统(显然不是全部,而是未使用的"大块")。如果您迫不及待想要发生这种情况,则可以调用debug.FreeOSMemory()强制执行此行为:

FreeOSMemory forces a garbage collection followed by an attempt to return as much memory to the operating system as possible. (Even if this is not called, the runtime gradually returns memory to the operating system in a background task.)

看看这种古老但确实有用的问题+答案:

Go 1.3垃圾收集器未将服务器内存释放回系统


当不再有引用时,它将最终被发布,Go具有相当不错的GC。