On Friday, March 3, 2017 at 9:05:50 AM UTC+2, Yota Toyama wrote: > > Nathan, > > As I posted above right after you posted, you are right. > "Memory leak" was gone when I inserted sleep at the loop end. > Thank you for your advice! > > Yota > > On Friday, March 3, 2017 at 10:39:02 AM UTC+9, Nathan Fisher wrote: >> >> Hi Yota, >> >> I don't disagree there's value in understanding how Go handles the >> scenario. What I'm not certain of is the potential tradeoffs when >> optimising for an uncommon edge case. >> >> The loop you've created is very tight and would be unusual to find in a >> typical application. The allocator is moving faster than GC could ever hope >> to keep up. Given it's an endless loop without any work I think there would >> be a tradeoff of performance to guard against something that will only >> exist in micro-benchmarks and/or invalid code. >> >> I would expect that if you introduce some "work" the memory leak would go >> away. >> >> Kind regards, >> Nathan >> >> On Fri, 3 Mar 2017 at 01:10 Yota Toyama <rav...@gmail.com> wrote: >> >>> 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...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- >> - from my thumbs to your eyes >> >
instead of time.Sleep(), use runtime. Gosched(). Djadala -- 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.