ruby 内存泄漏追踪

使用 rbtrace

#main.rb 要调试的程序
require 'rbtrace'
arr = []
loop do 
  arr << 1
  sleep
end
#trace.rb
require 'objspace'
ObjectSpace.trace_object_allocations_start

运行进程 ruby -I ./ -r trace main.rb

Thread.new{GC.start;require "objspace";io=File.open("/tmp/ruby-heap.dump", "w"); ObjectSpace.dump_all(output: io); io.close}

收集3次结果

rbtrace -p $pid -e 'load "/Users/neal/cmd.rb"'
# => a1.txt, a2,txt, a3.txt

分析程序

require 'set'  
require 'json'

if ARGV.length != 3  
  puts "Usage: detect_leaks [FIRST.json] [SECOND.json] [THIRD.json]"
  exit 1
end

first_addrs = Set.new  
third_addrs = Set.new

# Get a list of memory addresses from the first dump
File.open(ARGV[0], "r").each_line do |line|  
  parsed = JSON.parse(line)
  first_addrs << parsed["address"] if parsed && parsed["address"]
end

# Get a list of memory addresses from the last dump
File.open(ARGV[2], "r").each_line do |line|  
  parsed = JSON.parse(line)
  third_addrs << parsed["address"] if parsed && parsed["address"]
end

diff = []

# Get a list of all items present in both the second and
# third dumps but not in the first.
File.open(ARGV[1], "r").each_line do |line|  
  parsed = JSON.parse(line)
  if parsed && parsed["address"]
    if !first_addrs.include?(parsed["address"]) && third_addrs.include?(parsed["address"])
      diff << parsed
    end
  end
end

# Group items
diff.group_by do |x|  
  [x["type"], x["file"], x["line"]]
end.map do |x,y|  
  # Collect memory size
  [x, y.count, y.inject(0){|sum,i| sum + (i['bytesize'] || 0) }, y.inject(0){|sum,i| sum + (i['memsize'] || 0) }]
end.sort do |a,b|  
  b[1] <=> a[1]
end.each do |x,y,bytesize,memsize|  
  # Output information about each potential leak
  puts "Leaked #{y} #{x[0]} objects of size #{bytesize}/#{memsize} at: #{x[1]}:#{x[2]}"
end

# Also output total memory usage, because why not?
memsize = diff.inject(0){|sum,i| sum + (i['memsize'] || 0) }  
bytesize = diff.inject(0){|sum,i| sum + (i['bytesize'] || 0) }  
puts "\n\nTotal Size: #{bytesize}/#{memsize}"  

执行

ruby diff.rb a1.txt a2.txt a3.txt

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容