好吧,這是我第二次嘗試用我的Sinatra應用程序調試內存問題。我相信我這次已經將它簡化爲簡單的示例代碼。Ruby符號#to_proc泄漏1.9.2-p180中的引用?
看來,當我通過.map(&:some_method)
篩選數組時,它會導致該數組中的項不會被垃圾收集。運行等效的.map{|x| x.some_method}
是完全正常的。
演示:給定一個簡單的示例類:
class C
def foo
"foo"
end
end
如果我在運行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
所以到C的引用不復存在。好。但用map{|x| x.foo} with map(&:foo)
(這是標榜當量),它不會收集:
ruby-1.9.2-p180 :001 > a = 10.times.map{C.new}
=> [...]
ruby-1.9.2-p180 :002 > b = a.map(&: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){}
=> 10
ruby-1.9.2-p180 :008 >
這是一個Ruby的錯誤?我會嘗試在更多版本的紅寶石確定,但這似乎是一個明顯的問題。任何人都知道我在做什麼錯了?
編輯:
我已經在1.8.7-P352嘗試這樣做,它不會有問題。 1.9.3-preview1 確實但是仍然存在問題。是錯誤報告按順序還是我做錯了什麼?
EDIT2:格式化(?爲什麼把四個空格每一行產生語法高亮之前,而<pre>
標籤不)
我會嘗試發送一個錯誤報告,但我無法在Ruby redmine上設置一個帳戶。如果他們的登錄系統出現問題,我會等到晚些時候。 –
我正在使用Google Mail,並將其確認郵件標記爲垃圾郵件。也許你應該檢查你的垃圾郵件文件夾:D –
良好的通話!我不知道他們甚至發送了確認郵件。無論如何,Bug#5261:http://redmine.ruby-lang.org/issues/5261 –