【问题标题】:Find memory leak in a Ruby on Rails project在 Ruby on Rails 项目中查找内存泄漏
【发布时间】:2011-04-19 20:24:04
【问题描述】:

我有一个似乎是内存泄漏的 Ruby on Rails 项目。它一直使用越来越多的内存,直到崩溃。使用 ObjectSpace 转储每个类的对象数量我发现:

Name                                                              Count
-----------------------------------------------------------------------
String                                                           649476
Hash                                                              59695
Array                                                             39407
ActiveSupport::Multibyte::Codepoint                               19337
FileNode                                                          17134
Time                                                               3391
Regexp                                                             1944
ActionController::Routing::DividerSegment                          1743
Proc                                                               1597
Gem::Version                                                       1545
Class                                                              1503
Gem::Requirement                                                   1479
ActiveRecord::DynamicFinderMatch                                   1021

我相信 FileNode 是问题所在。这是一个模型。任何想法如何找到对 17k 文件节点的引用保存在哪里?

这是使用 Ruby 1.8.6 和 Rails 2.2.0。不幸的是,升级不是一种选择。

【问题讨论】:

  • 我遇到了同样的麻烦,除了我担心它与大量的字符串对象有关。每次我重新加载一个页面时,我都会得到大约 10,000 个从未被垃圾收集的新字符串。你在这里也有一个巨大的数字。你曾经解决过这个问题吗?
  • 嘿@pupeno,你还记得最终导致内存泄漏的原因吗?我认为有红宝石泄漏的例子会有很大的帮助:)
  • @UlysseBN 不,抱歉,时间太早了 :(

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


【解决方案1】:

Charles Oliver "Headius" Nutter 最近写了一系列关于使用 JVM 工具在 Ruby 中调试内存泄漏的博文:

IIRC,大约在同一时间,JRuby 社区的其他成员也发布了几篇关于同一主题的其他博客文章。

他们的基本论点(尽管他们太客气了,不能这么说)是使用 JRuby 以外的任何东西来调试内存泄漏简直是愚蠢的,仅仅是因为 JRuby 可以使用 Java 工具,而这些工具需要投入更多的工程精力比所有 Ruby 分析工具一起。 Ruby 社区免费获得这些工具,因为所有企业 Java 无人机都在为它们付费。

【讨论】:

  • 本地 C/C++ 扩展中似乎有很多内存泄漏。将物体留在周围是很容易的。在 Java 中也是可能的,但我认为它们更多的是边缘情况。
【解决方案2】:

我认为您会发现 Aman Gupta 的 Debugging Ruby 非常有帮助。他还一直致力于在 Rails 3 中查找和修复内存泄漏,因此他的调试技术肯定会有所帮助。

http://www.scribd.com/doc/23548865/Debugging-Ruby

【讨论】:

  • 这个网站只能用信用卡,有机会上传pdf吗?
【解决方案3】:

您可能想查看演示文稿“垃圾收集和 Ruby 堆”:

http://www.scribd.com/doc/32718051/Garbage-Collection-and-the-Ruby-Heap

从幻灯片 26 开始,解释各种有用的工具(ltrace、bleak_house、memprof 等)。

【讨论】:

  • 我希望能够使用 bleak_house。不幸的是,我们使用的是 Ruby 1.8.6,它似乎需要 1.8.7。
  • 这个网站只能用信用卡,有机会上传pdf吗?
  • 这不是我的演示文稿,所以这是非法的。
猜你喜欢
  • 2010-09-14
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 1970-01-01
  • 2013-09-15
  • 2011-03-13
  • 1970-01-01
相关资源
最近更新 更多