Ruby: 标记对象进行垃圾回收

7
我想知道是否有类似于Ruby对象的.finalize()方法,用于标记它们准备进行垃圾回收。如果我创建了20,000个对象,并且每个实例都有一个计数器,当计数器为零时,我希望对象被标记为可进行垃圾回收。我知道这基本上是一种Java方法,但我对Ruby底层没有足够的经验,无法理解如何更好地完成这项工作。
感谢您的答案、评论和反馈!

2
finalize 方法不会标记对象进行垃圾回收,它是在 GC 删除对象之前运行的方法(尽管没有保证)。 - pablochan
很高兴知道这一点,感谢您指出。是否有一个特定的方法可以明确地销毁对象或者至少将其置于运动状态?我喜欢魔术,但我也喜欢理解所揭示的技巧。 - Shyam
_why 写了一篇关于 Ruby 中垃圾回收的精彩文章,名为 "The Fully Upturned Bin"。幸运的是,在他决定从互联网上消失时,这篇文章得以保存:http://viewsourcecode.org/why/hacking/theFullyUpturnedBin.html - Michael Kohl
1
你只需要删除所有对对象的引用,例如如果你有一个引用x,你只需将其设置为null,或者你有一个局部变量超出了作用域。如果没有任何引用对象,则该对象可供GC使用。 - pablochan
1个回答

9
据我所知,您无法标记一个对象准备进行垃圾回收,但可以在任何时候强制执行垃圾回收:
GC.start

如果该项可以被释放,它将会被释放。

5
自从MRI 1.9.3引入了延迟垃圾回收(lazy sweep GC)后,这个说法不再正确。 - glebm
2
尽管如此,这部分仍然是正确的:“您无法将对象标记为准备进行垃圾回收”。Ruby使用相反的方法-可以访问的对象被标记为“不要删除”。在标记阶段完成后,其他所有内容都将被释放。这没有改变,只是当您调用GC.start时不会立即发生。 - Neil Slater

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