Also, it may just be that the runtime is better off allocating more and not doing a GC based on available memory and CPU usage. The “max heap” feature in development may help here.
> On Apr 28, 2020, at 3:18 PM, 'Kevin Chowski' via golang-nuts > <golang-nuts@googlegroups.com> wrote: > > > Guessing based on your latest description: are you aware that there is no > partial slice collection in GC? That is: > > > >> bigSlice := make([]int, 1000*1000) >> subSlice := bigSlice[0:1:1] >> bigSlice = nil >> runtime.GC() >> // At this point, bigSlice is still allocated! It cannot be freed by the GC >> (in the current implementation) >> useTheSlice(subSlice) > > You have to explicitly reallocate smaller slices (and copy over the data from > the big slice into each smaller slice) in order for the GC to be able to > collect each smaller slice individually. > > As suggested earlier in the thread, if you can create and share a small, > self-contained program which exhibits the behavior you're speaking of, > someone on this forum is much more likely to be able to help you. Trying to > guess how a memory leak is manifesting is just... guesswork without looking > at full code. There are lots of reasons why memory may not be collected by > the GC, including random bugs in your program :) > > >> On Tuesday, April 28, 2020 at 2:00:55 PM UTC-6, Naveen Kak wrote: >> Basically using the Top command at end of test. >> Let me give a quick summary of the scenario. >> >> Basically we have an application which keeps getting data on a TCP >> connection, we allocate a global slice to temporarily hold the data and then >> store in nested maps. >> For every TCP data transaction, we store the data in a global slice >> temporarily and then operate on the maps. >> For a certain amount of data, i know what should be the total allocation, >> but when i check using top command at end of test its almost always double >> or slightly more. >> >> if I call runtime.GC() on every tcp transaction, memory looks good and end >> of test it is as expected ( everything reclaimed) >> Is it because the system is heavily loaded ( per sec we may be getting huge >> no of transactions) so garbage collector cant keep track of the objects to >> be freed. >> As a test I even tried to block the delete operations on Map, just addition >> to maps on a smaller scale though, even then memory is almost double of what >> is expected. >> only solution is calling runtime.GC() on every tcp transaction, then >> everything is fine. >> I am really not sure whether the map deletions don't work properly or is it >> just the GC which is not able to work efficiently enough on its own. >> >> Calling GC so often is an overhead and would cause CPU spikes. >> >> >> >> >> >> >> >>> On Tue, Apr 28, 2020 at 3:21 AM Ian Lance Taylor <ia...@golang.org> wrote: >>>> On Sun, Apr 26, 2020 at 9:57 PM Naveen Kak <navee...@gmail.com> wrote: >>> >>>> I have my system up and running for let's say 10 hours or so where these >>>> operations on map ( continuous add/delete) keep happening. Memory keeps >>>> growing and goes very high. >>>> Eventually at end of test we clear all map entries, memory is reclaimed >>>> and is good. >>>> It's basically kind of load test. >>>> Appreciate your engagement. >>> >>> Thanks for the information, but you didn't really answer my question. How >>> exactly are you measuring whether the memory has been garbage collected? >>> >>> Ian >>> >>> >>>>> On Mon, 27 Apr, 2020, 3:41 AM Ian Lance Taylor, <ia...@golang.org> wrote: >>>>>> On Sun, Apr 26, 2020 at 2:48 PM <navee...@gmail.com> wrote: >>>>> >>>>>> https://play.golang.org/p/e22ufH-T2M1 >>>>>> >>>>>> This is my sample data structure. >>>>>> >>>>>> package main >>>>>> >>>>>> import ( >>>>>> "fmt" >>>>>> ) >>>>>> >>>>>> type MicroChkpt struct { >>>>>> comprtype uint32 >>>>>> MicroChkptInfoMap map[uint32][]byte >>>>>> } >>>>>> >>>>>> type CallChkpt struct { >>>>>> FullChkptData []byte >>>>>> MicroChkptMap map[uint32]*MicroChkpt >>>>>> ckey uint32 >>>>>> comprtype uint32 >>>>>> AuditInProgress bool >>>>>> } >>>>>> >>>>>> var CallChkptMap map[uint32]*CallChkpt >>>>>> >>>>>> func main() { >>>>>> fmt.Println("Hello, playground") >>>>>> } >>>>>> >>>>>> So its a nested map structure, >>>>>> CallChkptMap->MicroChkptMap->MicroChkptInfoMap >>>>>> So i was expecting on deleting an entry from the top level map >>>>>> CallChkptMap, whole underlying memory used by nested maps would be >>>>>> reclaimed. >>>>>> >>>>>> Its not happening till all entries are removed from the top level map( >>>>>> then only i see memory dipping), map has ongoing insert and delete >>>>>> operations and grows pretty big. >>>>>> Any workarounds to reclaim the memory on deleting the specific entry >>>>>> please? >>>>>> >>>>>> >>>>>> >>>>>> Should i go to the nested maps first, set them to nil and then delete >>>>>> the entry from the top level map? >>>>>> Appreciate all your time and inputs. >>>>>> >>>>> >>>>> >>>>> How exactly are you measuring whether the memory has been garbage >>>>> collected? >>>>> >>>>> 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/f4b8f164-085c-4d3e-8f51-c16138c3ac83%40googlegroups.com. -- 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/7E778BC9-5358-464A-8490-D61412A30982%40ix.netcom.com.