我正在跟踪应用程序中的内存泄漏问题(ruby 2.1).我正在使用这两种技术:ObjectSpace.dump_all将所有对象转储到JSON流然后进行离线分析.我使用的第二种技术是实时分析ObjectSpace.reachable_objects_from.在这两种方式中,我发现我泄漏的对象是由对象引用的RubyVM::Env.有人可以向我解释一下是什么RubyVM::Env.如何删除这些引用?
RubyVM::Env是一个内部 ruby 类,保存变量引用。这是我的测试:
require 'objspace'
a = Object.new
a_id = a.object_id # we use #object_id to avoid creating more reference to `a`
ObjectSpace.each_object.select{ |o| ObjectSpace.reachable_objects_from(o).map(&:object_id).include?(a_id) }.count
# => 1
env = ObjectSpace.each_object.select{ |o| ObjectSpace.reachable_objects_from(o).map(&:object_id).include?(a_id) }.first
# => #<RubyVM::Env:0x007ff39ac09a78>
ObjectSpace.reachable_objects_from(env).count
# => 5
a = nil # remove reference
ObjectSpace.reachable_objects_from(env).count
# => 4
Run Code Online (Sandbox Code Playgroud)