Hi Naveen,

Your expectations about the program immediately giving up memory on 
deleting an object are wrong.
If there is a need for you to have very tight memory controls, you could 
look into turning GC off entirely and managing memory yourself - See 
https://blog.twitch.tv/en/2019/04/10/go-memory-ballast-how-i-learnt-to-stop-worrying-and-love-the-heap-26c2462549a2/
 for 
example
iirc jvm behaves similarly and doesn't return memory to the OS right away 
for perf reasons as Ian mentioned.


On Thursday, May 7, 2020 at 2:24:40 PM UTC-7, Ian Lance Taylor wrote:
>
> On Thu, May 7, 2020 at 11:57 AM Naveen Kak <navee...@gmail.com 
> <javascript:>> wrote: 
> > 
> > Ian, 
> > Any thoughts on this? Appreciate a response. 
>
> I'm sorry, I'm not sure what you want a response on. 
>
> Using top is a fine way to see total memory usage of your application. 
> It's a terrible way to examine the Go garbage collector.  Using 
> runtime.ReadMemStats will give you a better understanding of the 
> garbage collector. 
>
> Whether it makes sense to use sync.Pool depends on your application. 
> The sync.Pool documentation explains when it is useful. 
>
> Ian 
>
>
> > On Tue, 5 May, 2020, 8:34 PM Naveen Kak, <navee...@gmail.com 
> <javascript:>> wrote: 
> >> 
> >> Hi Ian, 
> >> I explored a few things, calling debug.FreeOSMemory periodically. This 
> does help, I see a definitely a change in the memory being returned to the 
> OS ( looking at top o/p). 
> >> I also set the "GODEBUG=madvdonotneed=1", as per go documentation post 
> 1.12 release, go release it uses "madvfree" option which is basically a 
> lazy free to the OS. 
> >> This didn't surprisingly did not have any effect. 
> >> So one thing for sure that deleting map definitely doesn't have any 
> bug, its the way GC is working, not releasing everything back to OS ( I 
> think after running for 12 hours or so, if we leave the system idle i don't 
> think memory gets released back to OS, GC probably thinks it will be 
> required to ask for memory so holds on to it unless we call the 
> debug.FreeOSMemory periodically). 
> >> 
> >> What you think about using "sync pools" so that there are no frequent 
> memory allocations/de-allocations?, haven't explored this much yet. 
> >> Another thing, calling debug.FreeOSMemory periodically does cause CPU 
> spikes. 
> >> 
> >> Regards 
> >> Naveen 
> >> 
> >> 
> >> 
> >> 
> >> On Wed, Apr 29, 2020 at 2:16 AM Ian Lance Taylor <ia...@golang.org 
> <javascript:>> wrote: 
> >>> 
> >>> On Tue, Apr 28, 2020 at 1:00 PM Naveen Kak <navee...@gmail.com 
> <javascript:>> wrote: 
> >>>> 
> >>>> Basically using the Top command at end of test. 
> >>> 
> >>> 
> >>> The top command will show you the memory that the program has 
> requested from the operating system and has not returned to the operating 
> system.   The Go memory allocator works by requesting memory from the 
> operating system as it needs it.  The Go garbage collector works by looking 
> at that memory and marking it as available for future allocations by the Go 
> memory allocator.  The Go garbage collector does not immediately return 
> memory to the operating system.  That is because requesting from and 
> returning to the operating system are relatively slow operations, and a 
> program that has needed memory once is likely to need it again. 
> >>> 
> >>> So the top program is not a good way to judge what the garbage 
> collector is doing.  It is an OK way to judge the maximum memory use of the 
> program, which will include memory that has been allocated and memory that 
> has been garbage collected. 
> >>> 
> >>> If a Go program runs for a while with excess memory, it will slowly 
> return it to the operating system.  You can encourage that process by using 
> runtime/debug.FreeOSMemory. 
> >>> 
> >>> In general, though, if you want to examine the garbage collector, I 
> recommend that you use runtime.ReadMemStats rather than top. 
> >>> 
> >>> Ian 
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/de8ddca2-45b9-4d3c-9e69-bba6f62140bb%40googlegroups.com.

Reply via email to