2009-07-13 2 views
7

Поскольку http не имеет гражданства, каждый запрос приложения создает новый объект. Как Rails очищает неиспользуемые объекты/как часто?Ruby/Rails сбор мусора

ответ

12

Простой ответ: среда выполнения рубин имеет сборщик мусора. В зависимости от времени выполнения (JRuby/JVM generational GC, IronRuby/CLR generational GC, классический Ruby/mark-sweep GC) используются разные алгоритмы. Но основы довольно просты:

  • После запроса распределения, если есть «недостаточно свободное памяти» доступно - насколько недостаточно является одним из компонентов алгоритма GC - то GC начнет
  • GC начинается с сканирования корней, которые являются глобальными переменными и местоположениями стека (параметры и локальные переменные), чтобы обнаружить, какие объекты все еще живы; он отмечает каждый найденный объект
  • Затем процесс GC обрабатывает ссылки (ссылки) внутри этих объектов и возвращает в те объекты, которые еще не были отмечены.
  • Затем GC может начать перемещение/копирование всех отмеченных объектов так что они уплотняются в памяти
  • «Свободный указатель», откуда происходят новые выделения, сбрасывается до конца этого компактного блока памяти
  • Если по-прежнему имеется «недостаточно свободной памяти», тогда выделяется больше из операционной системы
  • Все старые объекты, которые не были отмечены во время процесса сканирования, являются мусором и неявно отбрасываются через th e копирование и сброс свободного указателя.

Частота коллекций зависит от настройки ОГО, который может быть затронут операционной системой, объем физической памяти, давление операционной системы памяти, управляемого пользователем настроек, лежащими в основе платформы версии ревизии, динамически оптимизирован параметры и т. д. Многое из этого сводится к тому, чтобы решить, где бар находится в тесте «недостаточно свободной памяти», хотя вещи становятся более сложными с коллекторами коллекций.

5

Если вас это интересует, вы должны ознакомиться с серией блога о сборке мусора с копией на запись командой Phusion и их усилиями по улучшению схемы ruby ​​gc по умолчанию в Ruby Enterprise Edition.

http://izumi.plan99.net/blog/index.php/2007/04/05/saving-memory-in-ruby-on-rails/

Другие ссылки в серии здесь:

http://www.rubyenterpriseedition.com/faq.html