Tamam, bu benim Sinatra uygulamam ile bellek sorunları hata ayıklamada ikinci denemedir. Bu sefer basit örnek kodlara başvurduğumu düşünüyorum.Ruby Symbol # to_proc, 1.9.2-p180'deki referanslara sızıyor mu?
Bir diziyi .map(&:some_method)
aracılığıyla filtrelediğimde, bu dizideki öğelerin çöp toplanmamasına neden oluyor. Eşdeğer .map{|x| x.some_method}
'u çalıştırmak tamamen iyi.
Gösteri: Basit bir örnek sınıfın Verilen:
class C
def foo
"foo"
end
end
ben IRB aşağıdaki çalıştırırsanız
, normal toplanan alır: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
Yani C'ye hayır referanslar artık mevcut. İyi. Ama (eşdeğer olarak duyurulan) map{|x| x.foo} with map(&:foo)
yerine, bu toplanan almaz:
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 >
bu bir yakut hata mı? Emin olmak için daha fazla ruby versiyonunu deneyeceğim ama bu bariz bir konu gibi görünüyor. Neyi yanlış yaptığımı bilen var mı?
Düzenleme:
Ben 1.8.7-p352 bu denedim ve sorunu yoktur. 1.9.3-preview1 ,'u hala yapıyor, ancak yine de sorun var. Bir hata raporu düzenli mi yoksa yanlış bir şey mi yapıyorum?
Edit2: biçimlendirme (? Neden <pre>
etiketleri yok ederken vurgulayarak her satırı üreten sözdizimi önce dört boşluk koyarak etmez)
Bir hata raporu göndermeyi denerim ancak Ruby redmine'de bir hesap oluşturmada sorun yaşıyorum. Giriş sistemiyle ilgili sorun yaşadıklarında daha sonra bekleyeceğim. –
Google Mail kullanıyorum ve onay postalarını spam olarak işaretledim. Belki de spam klasörünüzü kontrol etmelisiniz: D –
İyi çağrı! Onay postası bile göndermediklerini bilmiyordum. Her neyse, Hata # 5261: http://redmine.ruby-lang.org/issues/5261 –