| #!/usr/bin/env ruby |
| # |
| # |
| # VERY nice function from Robert Klemme to check memory leaks |
| # and check on what GC has collected since last call. |
| # |
| # Usage can be: |
| # |
| # require 'swig_gc' |
| # |
| # GC.stats |
| # # do some stuff.. |
| # GC.start # collect and report stats |
| # # do some more... |
| # GC.stats # just report stats |
| # |
| # or: |
| # |
| # require 'swig_gc' |
| # |
| # GC.track_class = String # track just String classes |
| # GC.stats |
| # # do some stuff.. |
| # GC.start # collect and report stats |
| # # do some more... |
| # GC.stats # just report stats |
| # |
| # |
| # |
| # |
| # |
| |
| module GC |
| |
| class << self |
| |
| attr :last_stat |
| attr_accessor :track_class |
| |
| alias :_start :start |
| |
| def start |
| _start |
| stats if $VERBOSE |
| end |
| |
| def stats |
| stats = Hash.new(0) |
| ObjectSpace.each_object {|o| stats[o.class] += 1} |
| |
| if track_class |
| v = stats[track_class] |
| printf "\t%-30s %10d", track_class.to_s, v |
| if last_stat |
| printf " | delta %10d", (v - last_stat[track_class]) |
| end |
| puts |
| else |
| stats.sort {|(k1,v1),(k2,v2)| v2 <=> v1}.each do |k,v| |
| printf "\t%-30s %10d", k, v |
| printf " | delta %10d", (v - last_stat[k]) if last_stat |
| puts |
| end |
| end |
| |
| last_stat = stats |
| end |
| end |
| |
| end |