猿问

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

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


慕婉清6462132
浏览 1183回答 2
2回答

达令说

这是一个您可能感兴趣的线程:为 GOGC=off 添加 runtime.Free()有趣的部分:Go GC 不再具有手动释放块的能力。此外,运行时。Free 是不安全的(人们可能会释放仍在使用中的指针或双重释放),然后 Go 努力摆脱的各种 C 内存问题将再次出现。另一个原因是运行时有时会在你背后分配,程序无法显式释放内存。如果你真的想用 Go 手动管理内存,请根据 syscall.Mmap 或 cgo malloc/free 实现自己的内存分配器。对于像 Go 这样的并发语言来说,长时间禁用 GC 通常是一个糟糕的解决方案。Go 的 GC 只会在未来变得更好。TL;DR:是的,但不要这样做

斯蒂芬大帝

我有点晚了,但是这个问题在谷歌上排名很高,所以这里是 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
随时随地看视频慕课网APP

相关分类

Go
我要回答