Ken*_*mon 2 ruby garbage-collection
对于好奇:事实证明我的内存泄漏与我在这里放入的样本无关.我认为我的问题已经解决了一些示例代码,但我的示例代码有不同的问题.我最终找到了我的真正问题,而且就在这里:Ruby Symbol#to_proc泄漏了1.9.2-p180中的引用?
我有两个红宝石类(Generator
和Member
,在该示例中),其中发电机用作工厂(在术语的宽泛的定义)的成员对象,并且每个部件保持到它构成发电机的参考.
码:
class Generator def new_member Member.new end end class Member attr_reader :generator def self.get(generator) @generator = generator puts "Provided generator: #{generator}" generator.new_member end end
使用IRB,我希望如果我只是调用我只是调用Member.get(Generator.new)
,但实际上并没有将结果赋给任何东西,那么对新构造的Generator
对象的引用和新构造的Member
对象都应该有零引用.所以垃圾收集器应该收集这两个对象.但它只收集会员,让发电机坐在附近:
ruby-1.9.2-p180 :001 > Member.get(Generator.new) Provided generator: #<Generator:0x007fcf398015c8> => #<Member:0x007fcf39801550> ruby-1.9.2-p180 :006 > GC.start => nil ruby-1.9.2-p180 :007 > ObjectSpace.each_object(Member){|m| puts m} => 0 ruby-1.9.2-p180 :008 > ObjectSpace.each_object(Generator){|g| puts g} #<Generator:0x007fcf398015c8> => 1
(ObjectSpace.each_object
据我所知,它返回一个仍然在ruby堆上的给定类的引用列表.)
为什么仍然存在对坐在的Generator对象的引用?我没有以任何方式将它保存到变量中,所以不应再有任何引用它的东西了.收集了Member对象,因此引用Generator类的实例变量不应该阻止它被收集.
我也不仅仅是好奇.我们有一个具有类似类结构的Sinatra应用程序,等效的Generator类存储了一个巨大的Member对象缓存,每个请求有几百兆,并且它永远不会被收集.Ruby内存不足,应用服务器必须重启每十几个请求.
你打电话的时候
Member.get(Generator.new)
Run Code Online (Sandbox Code Playgroud)
您为Member类设置类实例变量 @generator
:
@generator = generator
Run Code Online (Sandbox Code Playgroud)
通过调用初始行Member.get(Generator.new),没有什么可以创建成员,只需创建一个Generator实例,然后将其分配给类实例变量.
离开:
- >你收到的结果是完全正常的,Ruby的垃圾收集没有错.
归档时间: |
|
查看次数: |
704 次 |
最近记录: |