如何销毁Ruby对象?

29

假设有一个简单的对象,如下所示:

object = Object.new

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

有没有一种方法可以从内存中删除这个对象?


15
Ruby 运行在托管内存环境中;这是垃圾回收器的任务,它会为您完成这项工作。 - mcfinnigan
请参阅垃圾回收(计算机科学) - user2864740
4个回答

30

除了黑客攻击底层C代码之外,不行。垃圾回收由运行时管理,因此您不必担心它。这是关于Ruby 2.0算法的一个不错的参考

一旦在内存中没有对对象的引用,垃圾回收器就会开始工作。你应该没问题。


5
对于其他查看此内容的人,你不能简单地执行object = nil来清除内存。即垃圾回收器不会等待你执行object = nil并立即释放内存。它将根据自己的条件进行释放。 - hackstar15

20

简单地说,就是让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.

8

Ruby自动管理垃圾回收

通常情况下,Ruby会自动处理垃圾回收。当然,在某些边缘情况下需要手动处理,但是在一般情况下,您不必担心Ruby应用程序的垃圾回收。

垃圾回收的实现细节因Ruby版本而异,但它只提供了很少的参数可以调整,对于大多数目的,您不需要它们。如果您发现自己面临内存压力,您可能需要重新评估设计决策,而不是试图管理过度内存消耗的症状

手动触发垃圾回收

通常情况下,Ruby在对象超出作用域或不再引用时标记其进行垃圾回收。但是,例如Symbol等一些对象永远不会被回收,并将持续运行您的程序的整个运行时间。

您可以使用GC#start手动触发垃圾回收,但无法像从Ruby中的C程序那样释放内存块。如果您发现自己需要这样做,您可能需要解决潜在的X / Y问题,而不是直接处理内存。


我没有内存压力,只是想知道 Ruby 是如何工作的。 - Иван Бишевац

6
您不能显式销毁对象。Ruby具有自动内存管理功能。不再从任何地方引用的对象将由解释器内置的垃圾收集器自动收集。
阅读这篇好文章,了解如何明智地进行分配,以及您可以使用的一些工具来进行微调。 http://merbist.com/2010/07/29/object-allocation-why-you-should-care/是一篇很好的文章。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接