如何破坏Ruby对象?

Ива*_*вац 24 ruby object

假设有一个简单的对象:

object = Object.new
Run Code Online (Sandbox Code Playgroud)

据我所知,这会在内存(RAM)中创建对象.

有没有办法从RAM中删除此对象?

Vid*_*dya 25

除了黑客底层的C代码,没有.垃圾收集由运行时管理,因此您不必担心它.这是Ruby 2.0中算法的一个不错的参考.

一旦你没有对内存中的对象的引用,垃圾收集器就会开始工作.你应该没事.

  • 所以,删除引用我应该这样做:`object = nil`,对吗? (2认同)
  • 对于其他任何查看此内容的人,您将无法简单地使用object = nil来清除内存.即GC不等待你做object = nil然后立即释放内存.它将按照自己的条件进行. (2认同)

vgo*_*off 15

简单的答案是,让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.
Run Code Online (Sandbox Code Playgroud)


Tod*_*obs 7

Ruby自动管理垃圾收集

在大多数情况下,Ruby会自动处理垃圾收集.当然,有一些边缘情况,但在一般情况下,您应该永远不必担心典型的Ruby应用程序中的垃圾收集.

垃圾收集的实现细节因Ruby的版本而异,但它暴露了很少的旋钮,并且在大多数情况下你不需要它们.如果您发现自己处于内存压力之下,您可能需要重新评估您的设计决策,而不是尝试管理过多内存消耗的症状.

手动触发垃圾收集

一般而言,当Ruby超出范围或不再引用时,Ruby会将对象标记为垃圾收集.但是,某些对象(如符号)永远不会被收集,并且会在程序的整个运行时间内保持不变.

您可以使用GC#start手动触发垃圾收集,但不能像Ruby中的C程序那样真正释放内存块.如果您发现自己需要这样做,您可能希望解决潜在的X/Y问题,而不是尝试直接管理内存.


小智 5

您不能显式销毁对象。Ruby 具有自动内存管理功能。不再从任何地方引用的对象由解释器中内置的垃圾收集器自动收集。

关于如何明智地进行分配的好文章,以及一些可用于微调的工具。

http://merbist.com/2010/07/29/object-allocation-why-you-should-care/