Ruby泄露的对象由RubyVm :: Env引用

时间:2015-06-09 03:12:40

标签: ruby memory-leaks

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

1 个答案:

答案 0 :(得分:1)

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