Как уничтожить объект Ruby?
Предположим, что существует простой объект:
object = Object.new
Как я знаю, это создает Object в памяти (RAM).
Есть ли способ удалить этот объект из ОЗУ?
Ответы
Ответ 1
Кроме взлома базового кода C, нет. Сбор мусора управляется временем выполнения, поэтому вам не нужно беспокоиться об этом. Вот достойная ссылка по алгоритму в Ruby 2.0.
Как только у вас больше нет ссылок на объект в памяти, сборщик мусора пойдет на работу. Вы должны быть в порядке.
Ответ 2
Простой ответ: пусть GC выполняет свою работу.
Когда вы будете готовы избавиться от этой ссылки, просто object = nil
. И не ссылайтесь на object
.
Сборщик мусора в конечном итоге соберет его и очистит ссылку.
(from ruby site)
=== Implementation from GC
------------------------------------------------------------------------------
GC.start -> nil
GC.start(full_mark: true, immediate_sweep: true) -> nil
------------------------------------------------------------------------------
Initiates garbage collection, unless manually disabled.
This method is defined with keyword arguments that default to true:
def GC.start(full_mark: true, immediate_sweep: true); end
Use full_mark: false to perform a minor GC. Use immediate_sweep: false to
defer sweeping (use lazy sweep).
Note: These keyword arguments are implementation and version dependent. They
are not guaranteed to be future-compatible, and may be ignored if the
underlying implementation does not support them.
Ответ 3
Ruby автоматически управляет сборкой мусора
По большей части Ruby автоматически обрабатывает сборку мусора. Конечно, есть некоторые краевые случаи, но в общем случае вам никогда не придется беспокоиться о сборке мусора в типичном приложении Ruby.
Детали реализации сборки мусора варьируются в разных версиях Ruby, но в нем очень мало ручек для поворота, и для большинства целей они вам не нужны. Если вы окажетесь под давлением памяти, вы можете переоценить свои проектные решения, а не пытаться управлять симптомом избыточного потребления памяти.
Вручную сбор мусора
В общих чертах, Ruby отмечает объекты для сбора мусора, когда они выходят из сферы действия или больше не ссылаются. Однако некоторые объекты, такие как Symbols, никогда не собираются и сохраняются на протяжении всего времени выполнения вашей программы.
Вы можете вручную запускать сборку мусора с помощью GС# start, но не могут действительно освобождать блоки памяти так, как вы можете, с помощью программ C от в Ruby. Если вам нужно это сделать, вы можете решить основную проблему X/Y, а не пытаться напрямую управлять памятью.
Ответ 4
Вы не можете явно уничтожить объект. Ruby имеет автоматическое управление памятью. Объекты, которые больше не ссылаются нигде, автоматически собираются сборщиком мусора, встроенным в интерпретатор.
Хорошая статья, чтобы прочитать о том, как правильно распределить выделение, и несколько инструментов, которые вы можете использовать для тонкой настройки.
http://merbist.com/2010/07/29/object-allocation-why-you-should-care/