Поиск утечки памяти в проекте Ruby on Rails
У меня есть проект Ruby on Rails с тем, что кажется утечкой памяти. Он продолжает использовать все больше и больше памяти, пока не сработает. Сбрасывая количество объектов в классе с помощью ObjectSpace, я нашел это:
Name Count
-----------------------------------------------------------------------
String 649476
Hash 59695
Array 39407
ActiveSupport::Multibyte::Codepoint 19337
FileNode 17134
Time 3391
Regexp 1944
ActionController::Routing::DividerSegment 1743
Proc 1597
Gem::Version 1545
Class 1503
Gem::Requirement 1479
ActiveRecord::DynamicFinderMatch 1021
Я считаю, что проблема с FileNode. Это модель. Любые идеи, как найти, где хранятся ссылки на 17k FileNodes?
Это использует Ruby 1.8.6 и Rails 2.2.0. К сожалению, обновление не является вариантом.
Ответы
Ответ 1
Чарльз Оливер "Headius" Наттер недавно написал серию постов в блоге об устранении утечек памяти в Ruby с помощью инструментов JVM:
IIRC, было также несколько других сообщений в блоге на ту же тему другими членами сообщества JRuby в то же время.
Их основной аргумент (хотя они слишком вежливы, чтобы объяснить это таким образом) заключается в том, что использование чего-либо, кроме JRuby, для отладки утечек памяти просто глупо, просто потому, что JRuby может использовать инструменты Java, в которые вложено больше инженерных усилий, чем во всех Ruby. инструменты профилирования вместе. И сообщество Ruby получает эти инструменты бесплатно, потому что все корпоративные Java-дроны платят за них.
Ответ 2
Вы можете посмотреть презентацию "Сбор мусора и рубиновая куча":
http://www.scribd.com/doc/32718051/Garbage-Collection-and-the-Ruby-Heap
Начиная с Slide 26, объясняются различные полезные инструменты (ltrace, bleak_house, memprof и т.д.).
Ответ 3
Я думаю, что вы найдете Debugging Ruby от Aman Gupta очень полезным. Он также работал над поиском и исправлением утечек памяти в Rails 3, поэтому его методы отладки, безусловно, будут полезны.
http://www.scribd.com/doc/23548865/Debugging-Ruby