可以在go中手动释放内存吗?

时间:2016-06-15 09:30:55

标签: go

在与大学讨论后,我想知道是否有可能(即使完全没有任何意义)在go中手动释放内存(即使用不安全的包)。是吗?

2 个答案:

答案 0 :(得分:10)

以下是您可能感兴趣的主题:Add runtime.Free() for GOGC=off

有趣的部分:

  

Go GC无法手动取消分配块   了。此外,运行时。免费是不安全的(人们可能会自由   在使用指针或双免费)然后各种C内存问题   Go努力摆脱将会回来。另一个原因是   运行时有时会分配在你的背后,没有办法   为程序明确释放内存。

     

如果你真的想用Go手动管理内存,请实现你的   自己的内存分配器基于syscall.Mmap或cgo malloc / free。

     

长时间禁用GC通常是一个糟糕的解决方案   对于像Go这样的并发语言。而Go的GC只会更好   在路上。

TL; DR:是的,但不要这样做

答案 1 :(得分:0)

我有点晚了,但是这个问题在 google 上排名很高,所以这里是 DGraph 数据库创建者的一篇文章,它解释了 malloc/calloc 的替代品 jemalloc,值得一看

https://dgraph.io/blog/post/manual-memory-management-golang-jemalloc/

<块引用>

通过这些技术,我们可以两全其美:我们可以在关键的、受内存限制的代码路径中进行手动内存分配。同时,我们可以在非关键代码路径中获得自动垃圾收集的好处。即使您不习惯使用 Cgo 或 jemalloc,您也可以将这些技术应用于更大的 Go 内存块,并产生类似的影响。

而且我还没有测试过,但是有一个叫做 jemalloc-go 的 github 库

https://github.com/spinlock/jemalloc-go