gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:08:07 25 4
gpt4 key购买 nike

我正在跟踪我们的应用程序 (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

关于Ruby 泄露的对象被 RubyVm::Env 引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30722395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com