Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to deallocate memory manually in go?

Tags:

go

After discussion with college, I wonder if it would be possible (even if completely does not make any sense) to deallocate memory manually in go (ie. by using unsafe package). Is it?

like image 581
Sławosz Avatar asked Jun 15 '16 09:06

Sławosz


2 Answers

Here is a thread that may interest you: Add runtime.Free() for GOGC=off

Interesting part:

The Go GC does not have the ability to manually deallocate blocks anymore. And besides, runtime. Free is unsafe (people might free still in use pointers or double free) and then all sorts of C memory problem that Go tries hard to get rid of will come back. The other reason is that runtime sometimes allocates behind your back and there is no way for the program to explicitly free memory.

If you really want to manually manage memory with Go, implement your own memory allocator based on syscall.Mmap or cgo malloc/free.

Disabling GC for extended period of time is generally a bad solution for a concurrent language like Go. And Go's GC will only be better down the road.

TL;DR: Yes, but don't do it

like image 72
basgys Avatar answered Oct 28 '22 02:10

basgys


I am a bit late but this question is high ranked on google, so here is an article by the creator of DGraph database which explains an alternative to malloc/calloc which is jemalloc, worth a look

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

With these techniques, we get the best of both worlds: We can do manual memory allocation in critical, memory-bound code paths. At the same time, we can get the benefits of automatic garbage collection in non-critical code paths. Even if you are not comfortable using Cgo or jemalloc, you could apply these techniques on bigger chunks of Go memory, with similar impact.

And I haven't tested it yet, but there is a github library called jemalloc-go

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

like image 27
ThomasP1988 Avatar answered Oct 28 '22 02:10

ThomasP1988