16

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

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

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

4

2 回答 2

6

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

例如,如果您的某个课程的号码出乎意料,您就会更好地了解在哪里寻找。

于 2012-11-09T18:28:33.920 回答
-1

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

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

于 2012-11-09T18:44:39.767 回答