相关疑难解决方法(0)

在Ruby中查找内存泄漏的原因

我发现我的Rails代码中存在内存泄漏 - 也就是说,我发现代码泄漏但不泄漏的原因.我把它减少到不需要Rails的测试用例:

require 'csspool'
require 'ruby-mass'

def report
    puts 'Memory ' + `ps ax -o pid,rss | grep -E "^[[:space:]]*#{$$}"`.strip.split.map(&:to_i)[1].to_s + 'KB'
    Mass.print
end

report

# note I do not store the return value here
CSSPool::CSS::Document.parse(File.new('/home/jason/big.css'))

ObjectSpace.garbage_collect
sleep 1

report
Run Code Online (Sandbox Code Playgroud)

据说红宝石质量可以让我看到记忆中的所有物体.CSSPool是一个基于racc的CSS解析器./home/jason/big.css是一个1.5MB的CSS文件.

这输出:

Memory 9264KB

==================================================
 Objects within [] namespace
==================================================
  String: 7261
  RubyVM::InstructionSequence: 1151
  Array: 562
  Class: 313
  Regexp: 181
  Proc: 111
  Encoding: 99
  Gem::StubSpecification: 66
  Gem::StubSpecification::StubLine: …
Run Code Online (Sandbox Code Playgroud)

ruby valgrind memory-leaks

57
推荐指数
4
解决办法
1万
查看次数

Sidekiq在工人完成后没有释放内存

我有大约六个执行JSON爬行的Sidekiq工作者.根据端点的数据集大小,它们在1分钟到4小时之间完成.特别是,观看长达4小时的长时间,我看到随着时间的推移,内存会略有增加.

这不是问题,直到我想再次安排相同的工作人员工作.内存没有被释放并堆积起来,直到我遇到Linux OOM Killer,摆脱了我的Sidekiq进程.

内存泄漏?我在ObjectSpace中观察了不同对象的数量:

ObjectSpace.each_object.inject(Hash.new(0)) { |count, o| count[o.class] += 1 }
Run Code Online (Sandbox Code Playgroud)

那里没有真正的增加,哈希,数组等的集合保持不变,垃圾收集器一扫而空,并gc.stat[:count]告诉我,垃圾收集器也在工作.

即使在工作人员完成之后,例如我得到[完成]记录并且没有工人正忙,但内存不会被释放.这是什么原因?我可以对此做点什么吗?写一个终结者?

目前唯一的解决方案:重启Sidekiq进程.

我在Ruby 2.0.0上使用Ruby MRI.


对于JSON解析,我使用Yajl,因此是C绑定.我需要它,因为它似乎是唯一能够正确实现流式读写的快速JSON解析器.

ruby memory-leaks memory-management out-of-memory sidekiq

30
推荐指数
1
解决办法
9277
查看次数