在尝试追踪 Rails 应用程序中的内存泄漏时,我发现了一个奇怪的效果。谁能解释这里发生了什么?
将此脚本保存为纯 Ruby 脚本(不需要 Rails):
class Fnord
def to_s
'fnord'
end
end
def test
f = Fnord.new
end
test
GC.start
sleep 2
ObjectSpace.each_object do |o|
puts o if o.is_a? Fnord
end
当我通过
ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]
我得到以下信息:
bash $ ruby var_test
fnord
虽然变量 f 超出了范围,但没有其他对单个 Fnord 对象的引用,而且我已经收集了垃圾,该对象似乎仍然存在。这是某种邪恶的内存泄漏,还是我完全错过了关于 Ruby 的一些东西?
此外,如果我将测试方法更改为:
def test
f = Fnord.new
f = nil
end
我没有输出。但这肯定不应该改变这里的语义吗?
非常感谢!