好的,这是我第二次尝试使用我的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 …