Поиск утечки памяти в проекте 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