From: Eric Mahurin Date: 2005-05-17T05:38:43+09:00 Subject: Re: Doubt about GC I'm also having troubles with garbage collection. The previous code worked for me, but this modified version doesn't quite. I still get 2 cars (#1 and old #4) in the end instead of 1 (#1). In the code below, I put the car numbers and object_id's in a class hash - kind of like weakref. It took me a little while to figure out, but intially the finalizer proc was also causing an object ref because I had it defined in initialize (created a ref to a binding in the object - I think). class Car @@cars = Hash.new Finalizer = proc { |id| i = @@cars.index(id) puts("Garbage car #{i}:#{id}") @@cars.delete(i) if i } def initialize(n) @number=n puts "Creating #{self}" @@cars[n] = object_id ObjectSpace.define_finalizer(self,Finalizer) end def to_s "Car no. #{@number}:#{object_id}" end def Car.listCars puts "\nListing cars (from @@cars keys):" @@cars.each_key { |n| puts "Car no. #{n}" } puts "\nListing cars (from @@cars values):" @@cars.each_value { |id| puts ObjectSpace._id2ref(id) } puts "\nListing cars (from ObjectSpace):" ObjectSpace.each_object(Car) {|o| puts o} puts end end c1 = Car.new(1) Car.new(2) Car.new(3) Car.listCars() Car.new(4) Car.new(5) Car.new(3) Car.new(4) Car.listCars(); puts "Firing gc." GC.start sleep(1) Car.listCars(); sleep(1) GC.start sleep(1) Car.listCars(); Yahoo! Mail Stay connected, organized, and protected. Take the tour: http://tour.mail.yahoo.com/mailtour.html