From: "Brian Schröder" Date: 2005-08-11T00:20:46+09:00 Subject: Re: force_recycle On 10/08/05, Kroeger Simon (ext) wrote: > Hi List, > > is there a way to tell the GC that an object isn't needed anymore? > > There is a rb_force_recycle which may do the trick, but I found no > way to access it from ruby. > > (and of course this shouldn't be necessary in 'most' situations) > > cheers > > Simon > > The cleanest way i can think of would be to set the references to nil, and call GC.start. This will not in every case collect the object (because there may be something looking like a reference in some register). As an insane idea maybe you could use something like weakref to channel all pointers through one object if you're program logic may hold some unused references somewhere. (Though getting rid of the unused references may make more sense). E.g.: $ cat collectme.rb class Collectme def initialize @data = Array.new(2**18) end def hello puts "I'm big!" end end class Collected class << self alias :_new :new end def self.new @@instance ||= _new end end class CollectProxy def initialize(object) @_object = object end def method_missing(m, *args, &block) raise "Already collected" if @_object == Collected.new @_object.__send__(m, *args, &block) end def respond_to?(*m) raise "Already collected" if @_object == Collected.new super(*m) || @_object.respond_to?(*m) end def methods super() + @_object.methods end def garbage_collect @_object = Collected.new GC.start end end puts "Memory before allocation:" system "ps -o vsize -p #{$$}" my_big_objects = Array.new(12) { CollectProxy.new(Collectme.new) } puts "Memory after allocation:" system "ps -o vsize -p #{$$}" my_big_objects.each do | my_big_object | my_big_object.hello end puts "Memory after call:" system "ps -o vsize -p #{$$}" my_big_objects.each do | my_big_object | my_big_object.garbage_collect end puts "Memory after collect:" system "ps -o vsize -p #{$$}" puts "Calling collected object" my_big_objects.each do | my_big_object | my_big_object.hello end $ ruby collectme.rb Memory before allocation: VSZ 3084 Memory after allocation: VSZ 15420 I'm big! I'm big! I'm big! I'm big! I'm big! I'm big! I'm big! I'm big! I'm big! I'm big! I'm big! I'm big! Memory after call: VSZ 15420 Memory after collect: VSZ 4112 Calling collected object collectme.rb:29:in `method_missing': Already collected (RuntimeError) from collectme.rb:68 from collectme.rb:68:in `each' from collectme.rb:68 but this is just for fun. regards, Brian -- http://ruby.brian-schroeder.de/ Stringed instrument chords: http://chordlist.brian-schroeder.de/