2010-10-01 48 views
13

我有一个Ruby on Rails项目,它似乎是内存泄漏。它一直使用越来越多的内存,直到它崩溃。使用ObjectSpace倾倒每个类的对象我发现这个:在Ruby on Rails项目中查找内存泄漏

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 FileNodes的引用保存在哪里?

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

+0

我有同样的问题,只是我担心它涉及到字符串对象的数量巨大。每次我重新加载页面时,我都会得到大约10,000个永不会收集垃圾的新字符串。你在这里也有一个很大的数字。你能解决这个问题吗? – 2012-11-17 09:01:42

回答

5

你可能想看看在演示“垃圾收集和红宝石堆”:

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

从幻灯片26个多种有用的工具(ltrace,bleak_house,memprof等)开始得到解释。

+0

我很乐意能够使用bleak_house。不幸的是,我们使用的是Ruby 1.8.6,它似乎需要1.8.7。 – Pablo 2010-10-01 14:13:41

+0

memprof不适用于你? – rogerdpack 2010-10-01 16:25:47

7

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

IIRC,在同一时间,JRuby社区的其他成员也对同一主题发表了其他一些博文。

他们的基本论点(尽管他们太客气了,不能用这种方式说明)是使用JRuby以外的任何方法来调试内存泄漏只是简单的愚蠢,因为JRuby可以使用Java工具,他们比全都红宝石剖析工具在一起。 Ruby社区免费获得这些工具,因为所有的企业Java无人机都在为它们付费。

+0

看起来好像很多内存泄漏出现在本机C/C++扩展中。把物体放在身边很容易。在Java中也是可能的,但我认为它们更多是边缘情况。 – Amala 2013-12-12 15:10:15