Хорошо, это моя вторая попытка отладить проблемы с памятью с помощью моего приложения Sinatra. На этот раз я думаю, что на этот раз я записал ее в простой пример кода.
Кажется, когда я фильтрую массив через .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} на 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 >
Это рубиновая ошибка? I ' Я попробую использовать другие версии Ruby, чтобы убедиться, но это кажется очевидной проблемой. Кто-нибудь знает, что я делаю не так?
Редактировать:
Я пробовал это в 1.8.7-p352, и это не так. у меня есть проблема. 1.9.3-preview1 есть , но все еще есть i ssue. Отчет об ошибке в порядке или я что-то делаю не так?
Edit2: форматирование (почему размещение четырех пробелов перед каждой строкой приводит к выделению синтаксиса, а теги
- нет?)