如何在Heroku上找到内存泄漏?

Mar*_* M. 16 ruby ruby-on-rails heroku ruby-1.9.3 ruby-on-rails-3.2

我有一个使用Ruby 1.9.3在Heroku Cedar上运行的Rails 3.2.8应用程序.该应用程序在启动时运行良好,但经过一天左右的连续使用后,我开始在我的日志上看到R14错误.一旦内存错误开始,即使应用程序闲置几个小时,它们也永远不会消失.

垃圾收集器不应该在一段时间后清理未使用的对象并减少内存负载吗?似乎Heroku上没有发生这种情况.通常,在运行一些包含数千行数据的报告后,内存使用率开始上升,尽管结果是分页的.

我怎样才能找到内存泄漏?像bleak_house这样的插件已经过时了,或者在Heroku环境中运行得不好.我可以调整GC设置以使其更具侵略性吗?

Mar*_*une 6

GC应该进行清理,可能会这样做.

您可以强制GC GC.start; 如果没有收集到许多物品,我会怀疑这不是问题.

您是否有可能以某种方式创建一堆对象并且永远不会通过保留缓存副本或其他东西来释放它们?

我不熟悉现有的工具来检查这个,但您可能想要检查使用哪些对象ObjectSpace.例如:

ObjectSpace.each_object.with_object(Hash.new(0)){|obj, h| h[obj.class] +=1 }
# => a Hash with the number of objects by class
Run Code Online (Sandbox Code Playgroud)

例如,如果您为其中一个课程获得了意外的数字,那么您可以更好地了解在哪里寻找.