Ruby 泄漏的对象被 RubyVm::Env 引用

Ruby leaked objects are referenced by RubyVm::Env

我正在跟踪我们应用程序 (ruby 2.1) 中的内存泄漏问题。我正在使用这两种技术:ObjectSpace.dump_all 将所有对象转储到 JSON 流,然后进行离线分析。我使用的第二种技术是使用 ObjectSpace.reachable_objects_from 进行实时分析。通过这两种方式,我发现我的泄漏对象被一个对象RubyVM::Env引用了。任何人都可以向我解释什么是 RubyVM::Env。如何删除这些引用?

RubyVM::Env 是一个内部的 ruby class 保存变量引用。这是我的测试:

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