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