为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕婉清6462132 2022-01-17 18:19:02
在与大学讨论之后,我想知道是否有可能(即使完全没有任何意义)在 go 中手动释放内存(即通过使用 unsafe 包)。是吗?
查看完整描述

2 回答

?
达令说

TA贡献1821条经验 获得超6个赞

这是一个您可能感兴趣的线程:为 GOGC=off 添加 runtime.Free()

有趣的部分:

Go GC 不再具有手动释放块的能力。此外,运行时。Free 是不安全的(人们可能会释放仍在使用中的指针或双重释放),然后 Go 努力摆脱的各种 C 内存问题将再次出现。另一个原因是运行时有时会在你背后分配,程序无法显式释放内存。

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

对于像 Go 这样的并发语言来说,长时间禁用 GC 通常是一个糟糕的解决方案。Go 的 GC 只会在未来变得更好。

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


查看完整回答
反对 回复 2022-01-17
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

我有点晚了,但是这个问题在谷歌上排名很高,所以这里是 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


查看完整回答
反对 回复 2022-01-17
  • 2 回答
  • 0 关注
  • 1182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号