From: "Brian Schröder" Date: 2005-08-23T23:09:18+09:00 Subject: Re: Very strange GC behaviour On 23/08/05, Geert Fannes wrote: > Hello, can someone explain why GC fails to release "a" in the program > hereunder. When I exchange the lines "a=A.new" and "b=B.new", GC fails > to release b. > > > > PROGRAM > > #create some dummy classes > > class A;end > > class B;end > > > > #create two variables, one for each dummy class > > a=A.new > > b=B.new > > > > #store the object_id's for these object to check if these are still > present > > bid=b.object_id > > aid=a.object_id > > > > #check which objects can still be found > > ObjectSpace.each_object{|obj|puts("a still found") if > obj.object_id==aid;puts("b still found") if obj.object_id==bid} > > puts("") > > > > #set both objects to nil and do garbage collection > > b=nil > > a=nil > > GC.start > > > > #check again which object are still present. Both a and b should be > gone, but that is not the case > > ObjectSpace.each_object{|obj|puts("a still found") if > obj.object_id==aid;puts("b still found") if obj.object_id==bid} > > > > > > OUTPUT: > > gfannes@ivon gruby $ ruby test.rb > > b still found > > a still found > > > > a still found > > gfannes@ivon gruby $ > > > > Greetings, > > Geert > > > The Garbage Collector is conservative. If the address of an object stays in some register, or even some calculation filled a register with a number that happens to equal the address, the pointed-to object will not be gc'ed. regards, Brian -- http://ruby.brian-schroeder.de/ Stringed instrument chords: http://chordlist.brian-schroeder.de/