2009-10-28 3 views
1

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

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

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

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

ответ

2

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

Вот некоторые чтения на предмет отладки проблем GC памяти: http://blog.evanweaver.com/articles/2009/04/09/ruby-gc-tuning/

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

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

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

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

+0

Можем ли мы получить обновление для этого ответа? Эта статья ссылается на некоторые исправления и тому подобное, но все они для Ruby 1.8. Спасибо! –