Сборка мусора (Garbage Collection, GC) в Ruby — это автоматический процесс управления памятью, который освобождает память от объектов, ставших недостижимыми. Рассмотрим этот механизм подробно.
Ruby использует маркировку и очистку (mark-and-sweep) как основной алгоритм GC. Процесс состоит из двух фаз:
# Пример работы GC
obj = Object.new # Создаётся объект в памяти
obj = nil # Теперь объект недостижим и будет собран GC
С Ruby 2.1 используется generational garbage collection, которая делит объекты на поколения:
# Ruby автоматически управляет поколениями
100.times { Object.new } # Большинство попадут в молодое поколение
GC.start # Принудительная сборка мусора
Сборка мусора запускается при:
GC.start
В Ruby можно настраивать параметры GC (версии 2.1+):
GC::Profiler.enable # Включение профилировщика
GC.stat # Получение статистики
GC.start # Принудительный запуск GC
Пример обнаружения утечки:
# Плохой код (создаёт утечку)
@leak = []
100_000.times { @leak << "string" }
Особенности Ruby GC:
GC.start
Пример оптимизации:
# Лучше (меньше объектов)
frozen_string = "constant".freeze
100.times { puts frozen_string }
# Хуже (много одинаковых объектов)
100.times { puts "constant" }
Полезные инструменты для работы с GC:
GC.stat
— статистика сборки мусораObjectSpace
— инспекция объектов в памятиmemory_profiler
gem — профилирование памятиderailed_benchmarks
— поиск утечек памяти в RailsПример использования:
# Получение статистики
GC.stat.each { |k, v| puts "#{k}: #{v}" }
# Количество объектов в памяти
ObjectSpace.count_objects
Резюмируем: сборка мусора в Ruby — это сложный автоматизированный процесс, использующий generational mark-and-sweep алгоритм. Понимание его работы помогает писать более эффективные программы и избегать проблем с памятью. Современные версии Ruby значительно улучшили производительность GC, но разработчикам всё равно следует учитывать его особенности.