假设有一个简单的对象,例如:
object = Object.new
据我所知,这会在内存(RAM)中创建对象。
有没有办法从 RAM 中删除这个对象?
除了破解底层C代码之外,没有。垃圾收集由运行时管理,因此您不必担心。这是 Ruby 2.0 中算法的不错参考。
一旦你不再引用内存中的对象,垃圾收集器就会开始工作。你应该没事。
简单的答案是,让 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.
在大多数情况下,Ruby 自动处理垃圾收集。当然,有一些边缘情况,但在一般情况下,您永远不必担心典型 Ruby 应用程序中的垃圾收集。
垃圾收集的实现细节在不同的 Ruby 版本之间有所不同,但它只暴露了很少的旋钮可以旋转,并且在大多数情况下您不需要它们。如果您发现自己处于内存压力之下,您可能需要重新评估您的设计决策,而不是尝试管理内存消耗过多的症状。
一般而言,当对象超出范围或不再被引用时,Ruby 会将对象标记为垃圾回收。但是,某些对象(例如Symbols)永远不会被收集,并且会在程序的整个运行时持续存在。
您可以使用GC#start手动触发垃圾收集,但不能像使用 Ruby 中的 C 程序那样真正释放内存块。如果您发现自己需要这样做,您可能希望解决底层的 X/Y 问题,而不是尝试直接管理内存。
您不能显式销毁对象。Ruby 具有自动内存管理功能。不再从任何地方引用的对象由解释器中内置的垃圾收集器自动收集。
关于如何明智地进行分配的好文章,以及一些可以用来微调的工具。
http://merbist.com/2010/07/29/object-allocation-why-you-should-care/