【问题标题】:Memory Leak in Rails App... string nightmareRails 应用程序中的内存泄漏...字符串噩梦
【发布时间】:2012-11-17 08:39:26
【问题描述】:

所以我有一个可怕的内存泄漏问题的 Rails 应用程序。我在 Heroku 上运行它,在过去的几天里,我一直在试图弄清楚到底是什么原因造成的,我不得不每隔 5 小时左右不断重启应用程序,否则内存超过 512 和我的应用崩溃了。

我正在使用 Oink,我的实例化类没有任何可疑之处。唯一的问题是,每次加载页面时,使用的内存都会增加。我加载哪个页面都没有关系,它似乎是随机的。

New Relic 也没有太大帮助,因为它与任何一个特定的控制器动作无关。

我唯一能找到的是使用 ObjectSpace,它显示了内存中大量的字符串对象,而且这个数字还在不断增长。我使用了一个小工具来记录字符串的值,它们都是空白的。不是零……而是空格。我的生产应用程序经常使用超过 200,000 个字符串对象。

有谁知道这些可能来自什么?这真的让我感到压力很大,我不得不每五个小时在我的电脑前才能让我的网站保持活力。

谢谢!

【问题讨论】:

  • 除了删除代码之外,很难给出具体的建议,直到你有最小的可能的例子来展示问题并发布
  • 然后在另一台服务器上运行它,并不断发出 CURL 请求,直到您可以复制为止。
  • 建议:不要使用string = string1 + string 2,也不要使用string += string1。执行:string << string 1,这种方式不会创建额外的字符串
  • 好的,重大突破。看来我只是在使用 HAML 引擎的页面上泄漏内存。如果我渲染 erb,则不会泄漏。如果我关闭布局并且在之前泄漏的相同控制器操作上不渲染任何内容,则不会泄漏。关于为什么会发生这种情况的任何想法?
  • 好吧,也许不是。我现在意识到这可能与垃圾收集器有关。我注意到我的随机部分比其他相同的部分要花费更长的时间来渲染。当我用谷歌搜索时,我发现了这个帖子:bibwild.wordpress.com/2011/06/28/… 不过这很奇怪,因为我没有从 Rails 2 升级

标签: ruby-on-rails string memory heroku memory-leaks


【解决方案1】:

好吧,这绝对是荒谬的,但经过两周的焦虑和挣扎,我找到了解决这个漏洞的办法。从字面上看,这一切都归结为这一行:

ActionMailer::Base.delivery_method = :smtp

在我的 application.rb 配置文件中。

应该是:

config.action_mailer.delivery_method = :smtp

我不知道我是怎么弄错的,但是男孩确实对我的应用造成了严重破坏。

有谁知道为什么会导致这样的问题?我在每个查询中都损失了大约一兆字节的内存。疯了。

【讨论】:

  • 谢谢你,你可能只是让我不那么头痛了。
  • 你是怎么想出来的?我的 Rails 应用程序让字符串变得疯狂,我不知道如何追踪创建它们的原因。
  • @MihaRekar 太糟糕了。我真的不得不通过几个月的提交及时回到过去,加载和启动每个提交,然后使用 Apache 基准测试工具向服务器发送请求,直到我发现没有任何问题的修订版。然后我逐个删除每个更改,直到找到使泄漏停止的更改。花了几天时间。
猜你喜欢
  • 1970-01-01
  • 2012-04-16
  • 2014-04-30
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-29
  • 2013-04-03
相关资源
最近更新 更多