#!/usr/bin/env ruby class ObjectKind attr_reader :name, :kind, :heap def initialize(name, kind, heap) @name = name @kind = kind @heap = heap end def hash @name.hash + @kind.hash + @heap.hash end def eql?(other) @name == other.name and @kind == other.kind and @heap == other.heap end def to_s "#{@heap}:#{@kind}:#{@name}" end end $sizeHistogram = {} $currentHeap = nil $stdin.each_line { | line | line.chomp! case line when "bootstrap_free_heap:", "utility_heap:" $currentHeap = line.chop when /^ 0x([0-9a-f]+)\.\.\.0x([0-9a-f]+): ([^,]+), size = ([0-9]+), kind = (.*)/ objectKind = ObjectKind.new($3, $5, $currentHeap) size = $4.to_i $sizeHistogram[objectKind] = 0 unless $sizeHistogram[objectKind] $sizeHistogram[objectKind] += size end } $sizeHistogram.keys.sort { | a, b | $sizeHistogram[b] <=> $sizeHistogram[a] }.each { | key | puts "#{key}: #{$sizeHistogram[key]}" }