假设我们有一个像这样的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
答案 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实现的血腥细节,请直接询问:)