我有一个
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 FileNodes引用的位置?
这是使用Ruby 1.8.6和Rails 2.2.0.不幸的是升级不是一个选择.
解决方法
Charles Oliver “Headius” Nutter最近写了一系列关于使用JVM工具调试Ruby内存泄漏的博文:
> Browsing Memory the JRuby Way
> Finding Leaks in Ruby Apps with Eclipse Memory Analyzer
> Browsing Memory with Ruby and Java Debug Interface
> Monitoring Memory with JRuby,Part 1: jhat and VisualVM
> Monitoring Memory with JRuby,Part 2: Eclipse Memory Analyzer
IIRC,同时也有JRuby社区的其他成员在同一主题上发表了几篇博客文章.
他们的基本观点(尽管他们太有礼貌地用这种方式来表示),使用JRuby以外的任何内容来调试内存泄漏只是简单的愚蠢,只是因为JRuby可以使用Java工具,而不是所有的Ruby一起分析工具. Ruby社区免费获得这些工具,因为所有的企业Java无人机都为他们付费.