我有一个使用Ruby 1.9.3在Heroku Cedar上运行的Rails 3.2.8应用程序。该应用程序在启动时运行良好,但经过一天左右的连续使用后,我开始在我的日志上看到R14错误。一旦内存错误开始,它们永远不会消失,即使应用程序闲置几个小时。
垃圾收集器不应该在一段时间后清理未使用的对象并减少内存负载吗?似乎Heroku上没有发生这种情况。通常,在运行一些包含数千行数据的报告后,内存使用率开始上升,尽管结果是分页的。
如何找到内存泄漏?像bleak_house这样的插件已经过时了,或者在Heroku环境中运行得不好。我可以调整GC设置以使其更具侵略性吗?
答案 0 :(得分: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
例如,如果您为其中一个课程获得了意外的数字,那么您可以更好地了解在哪里寻找。
答案 1 :(得分:-2)
安装New Relic插件。它有许多有用的指标,您可以使用它们找出泄漏的来源。我认为通常更好的想法是尝试查看代码的哪一部分执行时间最长并且可能尝试对其进行优化,而不是直接调整GC。
例如,New Relic包含的一些不错的功能是能够查明运行时间最长的SQL查询的来源。我鼓励你试一试。