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