I've been trying to root cause an OOM condition. My process is running within a cgroup with a 4gb limit. Occasionally that limit gets hit. I added a cgroup listener to watch for memory usage and create a pprof and core dump.
The pprof shows just a few hundred megs of "in-use" memory, however when I open the core dump with viewcore I'm seeing around 3.3gb of free spans that are being retained. "kept for reuse by Go"..
I've got GOGC set to 50 -- but my understanding is that just controls when a GC kicks off -- not when memory will be returned to the OS.
Is there some sort of behavior a program can do to create this type of situation? or a way to give a hint to the GC .. "hey... give it back!" :)
Thanks for any ideas or thoughts!