Отладка сборки мусора в Ruby - PullRequest
1 голос
/ 28 октября 2009

У меня проблемы с долгоживущим фоновым процессом ruby ​​на нашем сервере, который не очищает Tempfiles. Я использую hijack для внедрения в процесс и проверки вещей, например,

ObjectSpace.each_object(ActiveRecord::Base){|o| puts o}

- оказывается, что на рассматриваемые Tempfiles ссылается экземпляр одного из наших подклассов ActiveRecord, а эти экземпляры не собираются.

Я не смог выяснить, что ссылается на эти экземпляры AR и поддерживает их в живых. Какие-нибудь советы для получения доступа к любому графу объектов, который использует сборщик мусора?

1 Ответ

2 голосов
/ 28 октября 2009

Сборщик мусора в Ruby - это алгоритм разметки и метки: (1) начните с экземпляра Object, а затем пройдитесь по каждому достижимому объекту, отмечая его по пути (2), затем обойдите ObjectSpace для каждой ссылки на объект и удалите те, которые не являются отмечены.

Вот некоторые материалы по устранению проблем с памятью GC: * ​​1003 *http://blog.evanweaver.com/articles/2009/04/09/ruby-gc-tuning/

Единственные вещи в вашем приложении rails, которые являются долгоживущими, это классы и модули. Имея это в виду, некоторые места для поиска:

1) эти активные экземпляры записей спрятаны в переменной класса 2) как-то кешируется промежуточным ПО стойки 3) удерживается пулом соединений с активной записью базы данных 4) используете ли вы финализаторы ruby ​​(печально известные утечками памяти при неправильном использовании), см. Eigenclass.org/hiki/deferred-finalizers-in-Ruby

Извините, что я просто публикую кучу идей и несколько решений. Надеюсь, это заставит вас задуматься о новых направлениях.

Благословения, Ьнр

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...