Sha256: 89b46b4c3659f3035dff7d51681740eb85b145f1e2fe1dce2746b98b91274127

Contents?: true

Size: 1.58 KB

Versions: 1

Compression:

Stored size: 1.58 KB

Contents

require 'objspace'

module Memprof2
  class << self
    def start
      ObjectSpace.trace_object_allocations_start
    end

    def stop
      ObjectSpace.trace_object_allocations_stop
      ObjectSpace.trace_object_allocations_clear
    end

    def run(&block)
      ObjectSpace.trace_object_allocations(&block)
    end

    def report(opts={})
      ObjectSpace.trace_object_allocations_stop
      @rvalue_size = GC::INTERNAL_CONSTANTS[:RVALUE_SIZE]
      if @trace = opts[:trace]
        raise ArgumentError, "`trace` option must be a Regexp object" unless @trace.is_a?(Regexp)
      end
      if @ignore = opts[:ignore]
        raise ArgumentError, "`trace` option must be a Regexp object" unless @ignore.is_a?(Regexp)
      end
      results = {}
      ObjectSpace.each_object do |o|
        next unless (file = ObjectSpace.allocation_sourcefile(o))
        next if file == __FILE__
        next if (@trace  and @trace !~ file)
        next if (@ignore and @ignore =~ file)
        line = ObjectSpace.allocation_sourceline(o)
        memsize  = ObjectSpace.memsize_of(o) + @rvalue_size
        memsize = @rvalue_size if memsize > 100_000_000_000 # compensate for API bug
        klass = o.class.name rescue "BasicObject"
        location = "#{file}:#{line}:#{klass}"
        results[location] ||= 0
        results[location] += memsize
      end
      @out = opts[:out] || "/dev/stdout"
      File.open(@out, 'w') do |io|
        results.each do |location, memsize|
          io.puts "#{memsize} #{location}"
        end
      end
    ensure
      ObjectSpace.trace_object_allocations_start
    end
  end
end


Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
memprof2-0.0.1 lib/memprof2.rb