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

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

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

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

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

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

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

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

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

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

安装New Relic插件。 它有一堆有用的指标,您可以使用它们找出泄漏的来源。 我认为通常更好的想法是尝试查看代码的哪一部分执行时间最长并且可能尝试优化它,而不是直接调整GC。

例如,New Relic包含的一些不错的function是能够查明运行时间最长的SQL查询的来源。 我鼓励你试一试。