42 lines
986 B
Ruby
42 lines
986 B
Ruby
# frozen_string_literal: true
|
|
|
|
# to be used to compare ruby heaps generated in 2.1
|
|
# can isolate memory leaks
|
|
#
|
|
# rbtrace -p 15193 -e 'Thread.new{require "objspace"; ObjectSpace.trace_object_allocations_start; GC.start(full_mark: true); ObjectSpace.dump_all(output: File.open("heap.json","w"))}.join'
|
|
#
|
|
#
|
|
require "set"
|
|
require "json"
|
|
|
|
if ARGV.length != 2
|
|
puts "Usage: diff_heaps [ORIG.json] [AFTER.json]"
|
|
exit 1
|
|
end
|
|
|
|
origs = Set.new
|
|
|
|
File
|
|
.open(ARGV[0], "r")
|
|
.each_line do |line|
|
|
parsed = JSON.parse(line)
|
|
origs << parsed["address"] if parsed && parsed["address"]
|
|
end
|
|
|
|
diff = []
|
|
|
|
File
|
|
.open(ARGV[1], "r")
|
|
.each_line do |line|
|
|
parsed = JSON.parse(line)
|
|
if parsed && parsed["address"]
|
|
diff << parsed unless origs.include? parsed["address"]
|
|
end
|
|
end
|
|
|
|
diff
|
|
.group_by { |x| [x["type"], x["file"], x["line"]] }
|
|
.map { |x, y| [x, y.count] }
|
|
.sort { |a, b| b[1] <=> a[1] }
|
|
.each { |x, y| puts "Leaked #{y} #{x[0]} objects at: #{x[1]}:#{x[2]}" }
|