调试Ruby的垃圾收集

时间:2009-10-28 11:48:27

标签: ruby garbage-collection

我的服务器上存在长期存在的后台ruby进程问题,而不是清理Tempfiles。 我正在使用hijack注入流程&检查事物,例如,使用

ObjectSpace.each_object(ActiveRecord::Base){|o| puts o}

- 事实证明,我们的一个ActiveRecord子类的实例正在引用有问题的Tempfiles,并且没有收集这些实例。

我无法弄清楚引用这些AR实例的内容是什么?让他们活着。有关访问垃圾收集器使用的任何对象图的任何提示吗?

1 个答案:

答案 0 :(得分:2)

Ruby的垃圾收集器是一个标记&扫描算法:(1)从Object实例开始,然后遍历每个可到达的对象,沿着路径标记它们(2)然后遍历ObjectSpace以获取每个对象引用并删除那些未标记的对象。

以下是关于调试GC内存问题的一些解读:http://blog.evanweaver.com/articles/2009/04/09/ruby-gc-tuning/

rails应用程序中唯一长寿的东西是类和模块。考虑到这一点,有些地方是:

1)这些活动记录实例是否在类变量中被捕获 2)以某种方式被机架中间件缓存 3)由活动记录数据库连接池保持 4)你使用ruby终结器(因使用不当而臭名昭着的内存泄漏)请参阅eigenclass.org/hiki/deferred-finalizers-in-Ruby

很抱歉,我只是发布了一堆想法和一些解决方案。希望这会让你思考一些新的方向。

祝福, 雷公藤