Ruby 2中的垃圾收集,忽略方法的返回值会发生什么?

时间:2013-12-04 11:25:28

标签: ruby garbage-collection ruby-2.0

假设我们有一个像这样的Ruby类:

class MyClass
  def my_method(p)
     # do some cool stuff with a huge amount of objects 
     my_objects = ...

     return my_objects
  end
end

在应用程序的其他地方有一个调用MyClass的{​​{1}}的函数,非常像这样:

my_method

def my_func #doing some stuff .. MyClass.my_method(some_param) #doing other stuff .. end 列表会发生什么,是否有资格进行垃圾回收?是否有可能大致知道它何时被收集?

有没有办法将该列表“标记”为符合GC条件?也许是这样的:

objects

2 个答案:

答案 0 :(得分:2)

GC会破坏您的代码未引用的所有对象。通过将对象设置为nil,您可以更改变量的引用,因此对象将被GCed,但如果您使用第一个代码,则会发生完全相同的事情。真正的问题是 - 为什么你需要在精确的时刻将这个对象作为GB - 它根本不应该影响你的代码。

如果您真的想要更好地控制垃圾收集,可以查看GC类:http://www.ruby-doc.org/core-1.9.3/GC.html。请注意,您可以重新运行GC.start,这将强制GC在该精确时刻运行(即使没有任何内容可以收集)。

答案 1 :(得分:1)

从函数返回的项目一旦没有其他任何指向它们就有资格被收集。

所以,如果你忽略了返回值并且真的没有其他人记住这些对象,那么可以使用GC来实现这些对象。

因此,如果您将结果存储在objects变量中,那么只要objects变量仍然记住***),返回的值将被“固定”**)。当您nil该变量时,它们将被释放并等待收集。 Nilling那个变量可能加速他们的收集,但不一定非必要。 *)

除了其他任何人仍然记得他们。如果在objects=f()objects=nil之间读取objects变量中的值并将它们传递给其他函数/方法,并且如果它们碰巧存储了这些对象,那么当然它会固定它们同样,“nilling”将有助于释放资源,但不会立即收集。*)

(*)通常,在使用GC的环境中,您实际上从未知道GC何时运行以及它将收集什么。您只知道每个人都忘记的对象最终会被自动删除。而已。理论上,如果您的机器具有太字节的可用内存,GC可能会选择不运行。

(**)在某些环境(如.Net)中,“固定”是一个精确的术语。在这里我这样说就是为了帮助你想象它是如何工作的。我并不是指用于与较低级别的库等进行通信的内存块的实际固定。

(***)当一个对象A在哪里记住对象B时会记住对象C,如果“B”被遗忘,如果只有 B(和其他人)没有记住C,那么B和C都是GC。因此,您不必nil objects。如果在某个时刻包含objects变量的东西变成'遗忘',则“外部事物”,“对象”和“返回的项目”都将被GC。至少应该是,如果GC实施没问题。

这还有一点要说:我没有在Ruby 2.0中说过GC。我所说的一切都是关于垃圾收集器的。它也适用于Java,.Net,ObjC(带GC)等。如果您需要准确了解Ruby 2.0中发生的事情以及GC实现的血腥细节,请直接询问:)