Volker, I don't know if the term "memory leak" is misuse. But, the 1st version's memory usage is constant but the 2nd version's one grows over time as if nothing is garbage-collected.
Yota On Friday, March 3, 2017 at 2:38:08 AM UTC+9, Volker Dobler wrote: > > Am Donnerstag, 2. März 2017 17:15:05 UTC+1 schrieb Yota Toyama: >> >> Hi, all. >> >> I'm trying to understand argument liveness in Go 1.8. >> As preparation for it, I wrote 2 programs which iterate over infinite >> lists. >> At first, I thought both can be run forever without any memory leak. >> However, the result was that one could and the other couldn't. >> >> Their main difference is the way to iterate lists. >> >> l := *NewList(42, nil) >> >> for { >> l = *l.Rest() // Cause no memory leak :) >> } >> >> vs >> >> l := NewList(42, nil) >> >> for { >> l = l.Rest() // Cause memory leak!!! >> } >> >> The repository is here <https://github.com/raviqqe/argument-liveness.go>. >> I wanna understand why the latter causes memory leak and what is going on >> in my programs at low level. >> Any ideas? >> > > > What makes you say that one version causes a memory leak? > > The first version produces much less garbage (well, basically none): > l is a ListValue and the freshly created "list rest" is assigned to it, > basically just overwriting the memory location of l with the same > value. > > The second version produces an endless linked list where only the > last list element is reachable from your code as this is the only value > you have a pointer to. > > So the second produces tremendous amounts of garbage but this > garbage is collectable. Running it shows no problem when tracing GC > at least not with Go 1.8. > > So the main difference is: The first code does not produce an "endless > list" it just operates on one List value while the second code really > constructs an ever increasing linked list if List values where only the > tail is reachable/uncollectable. > > How did you determine the second version "leaks"? > > V > -- 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. For more options, visit https://groups.google.com/d/optout.