相关疑难解决方法(0)

Ruby Symbol#to_proc泄漏了1.9.2-p180中的引用?

好的,这是我第二次尝试使用我的Sinatra应用调试内存问题.我相信这次我把它固定成简单的示例代码.

似乎当我过滤一个数组时.map(&:some_method),它会导致该数组中的项目不被垃圾收集.运行等效.map{|x| x.some_method}的完全没问题.

演示:给出一个简单的示例类:

class C
  def foo
    "foo"
  end
end
Run Code Online (Sandbox Code Playgroud)

如果我在IRB中运行以下命令,它将被正常收集:

ruby-1.9.2-p180 :001 > a = 10.times.map{C.new}
 => [...]
ruby-1.9.2-p180 :002 > b = a.map{|x| x.foo}
 => ["foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo", "foo"]
ruby-1.9.2-p180 :003 > ObjectSpace.each_object(C){}
 => 10
ruby-1.9.2-p180 :004 > a = nil
 => nil
ruby-1.9.2-p180 :005 > b = nil
 => nil
ruby-1.9.2-p180 :006 > GC.start
 => nil
ruby-1.9.2-p180 :007 > ObjectSpace.each_object(C){}
 => 0
Run Code Online (Sandbox Code Playgroud)

所以不再存在对C的引用.好.但是替换map{|x| x.foo} with …

ruby memory-leaks

5
推荐指数
1
解决办法
369
查看次数

标签 统计

memory-leaks ×1

ruby ×1