On Thu, May 7, 2020 at 11:57 AM Naveen Kak <naveen.ka...@gmail.com> 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, <naveen.ka...@gmail.com> 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 <i...@golang.org> wrote:
>>>
>>> On Tue, Apr 28, 2020 at 1:00 PM Naveen Kak <naveen.ka...@gmail.com> 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/CAOyqgcVpxfH4xL8uaO5BR3hKZUHpJj5DqG1GrtDpHsjudmuA6w%40mail.gmail.com.

Reply via email to