class MemoryProfiler
def initialize(method_name)
@object_ids = []
@leaked_objects = []
@methodlog = "#{method_name}_profile.log"
end
def start
GC.start
ObjectSpace.each_object do |o|
@object_ids << o.object_id
end
end
def end
GC.start
ObjectSpace.each_object do |o|
@leaked_objects << o.object_id
end
@leaked_objects = @leaked_objects - @object_ids
puts "Oops..You've got #{@leaked_objects.size} screwed up objects!!" unless @leaked_objects.empty?
File.open(@methodlog,'w') do |f|
@leaked_objects.each do |o|
begin
f.puts ObjectSpace._id2ref(o).inspect
rescue Exception => e
puts "Something wrong happened while processing object #{o}"
end
end
end
end
end
class << self
def leaker
begin
puts"hello"
x = 1
nil
end
end
end
mp = MemoryProfiler.new("leaker")
mp.start
leaker
mp.end