Tag: 内存泄漏

这段代码是否在Ruby中创建了循环内存引用?

我有以下假设代码: class User ‘token’, :secret => ‘secret’) # I want to get the user’s posts in thread #12345. user.oauth_consumer.get_posts_in_thread(12345) 我想知道这是否创建了一个循环内存引用,其中user有oauth_consumer的引用,而oauth_consumer有一个对user的引用,因此无法进行垃圾回收? 或者底层GC实现(REE 1.8.7)是否处理​​这种情况?

如何处理Ruby 2.1.2内存泄漏?

我有一个工作进程,它产生多达50个线程并执行一些异步操作(大多数是http调用)。 当我启动该过程时,它从大约35MB的已用内存开始,并迅速增长到250MB。 从那时起它进一步增长,问题是内存永远不会停止增长(即使增长阶段随着时间的推移而减少)。 几天后,进程只会超出可用内存并崩溃。 我做了很多分析和分析,似乎无法找到问题所在。 即使堆大小非常不变,进程内存也在不断增长。 我已将GC.stat输出收集到您可以在此处访问的电子表格中: https://docs.google.com/spreadsheets/d/17TohDNXQ_MXM31CeAmR2ptHFYfvOeF3dB6WCBkBS_Bc/edit?usp=sharing 即使过程内存最终稳定在415MB,但它将在未来几天继续增长,直到达到512MB的限制并崩溃。 我也尝试使用对象空间跟踪对象,但跟踪对象的内存总和从不超过70-80MB,这与GC报告完全一致。 剩下的300MB +(并且还在增长)花在哪里……我不知道。 如何处理这些问题? 是否有任何工具可以让我更清楚地了解内存的使用方式? 更新:gem和操作系统 我正在使用以下gem: gem “require_all”, “~> 1.3” gem “thread”, “~> 0.1” gem “equalizer”, “~> 0.0.9” gem “digest-murmurhash”, “~> 0.3”, require: “digest/murmurhash” gem “google-api-client”, “~> 0.7”, require: “google/api_client” gem “aws-sdk”, “~> 1.44” 该应用程序部署在heroku上,但在Mac OS X 10.9.4上本地运行时,内存泄漏是显而易见的。 更新:泄漏 我已经升级了stringbuffer并分析了像@mtm建议的所有内容,现在没有leak工具识别的内存泄漏,随着时间的推移没有增加ruby堆大小,然而,进程内存仍在增长。 最初我以为它在某些时候停止了增长,但几个小时后它超过了极限并且过程崩溃了。

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

我有大约六个执行JSON爬行的 Sidekiq工作者 。 根据端点的数据集大小,它们在1分钟到4小时之间完成。 特别是,观看长4小时,我看到随着时间的推移内存略有增加。 这不是问题,直到我想再次安排相同的工作人员工作。 内存没有被释放并堆叠,直到我遇到Linux OOM Killer,摆脱了我的Sidekiq进程。 内存泄漏 ? 我在ObjectSpace中观察了不同对象的数量: ObjectSpace.each_object.inject(Hash.new(0)) { |count, o| count[o.class] += 1 } 那里没有真正的增加,哈希,数组等的集合保持不变,垃圾收集器和gc.stat[:count]告诉我,垃圾收集器也正在工作。 即使在工作人员完成之后,例如我得到[完成]记录并且没有工人正忙着,内存也不会被释放。 这是什么原因? 我可以对此做点什么吗? 写一个终结者? 目前唯一的解决方案 :重启Sidekiq进程。 我在Ruby 2.0.0上使用Ruby MRI。 对于JSON解析,我使用Yajl ,因此是C绑定。 我需要它,因为它似乎是唯一能够正确实现流式读写的快速JSON解析器。

Ruby Symbol#to_proc泄漏了1.9.2-p180中的引用?

好的,这是我第二次尝试使用我的Sinatra应用调试内存问题。 我相信这次我把它固定成简单的示例代码。 似乎当我通过.map(&:some_method)过滤数组时,它会导致该数组中的项目无法收集垃圾。 运行等效的.map{|x| x.some_method} .map{|x| x.some_method}完全没问题。 演示:给出一个简单的示例类: class C def foo “foo” end end 如果我在IRB中运行以下命令,它将被正常收集: ruby-1.9.2-p180 :001 > a = 10.times.map{C.new} => […] ruby-1.9.2-p180 :002 > b = a.map{|x| x.foo} => [“foo”, “foo”, “foo”, “foo”, “foo”, “foo”, “foo”, “foo”, “foo”, “foo”] ruby-1.9.2-p180 :003 > ObjectSpace.each_object(C){} => 10 ruby-1.9.2-p180 :004 > a = nil => […]

为什么Ruby有时只释放内存?

根据我如何生成字符串,Ruby会将内存释放到操作系统,或者不会。 第一个测试代码将占用大约235MB size = 2**22 string = ‘!@#$%^&*()-+~`a1234567890abcdefghijklmnopqrstuvwxyz’ * size puts ‘Sleeping…’ sleep(5) string = nil GC.start puts ‘Just sitting here..’ gets.chomp 调用GC.start后,测试使用的内存将缩减回几千字节。 但是如果我使用string = (0…size).map { (65 + rand(26)).chr }.join运行相同的测试,内存将高达250MB,内存使用实际上将增加到290MB GC.start 。 编辑:我正在使用Ruby 1.9.3-p448作为我正在研究的项目需要它。 虽然我将在Ruby 2.2上测试它并返回结果。 编辑2:在Ruby 2.1中运行测试代码(RVM中没有Ruby 2.2,我只是想快速运行测试)给出了类似的结果。 记忆仍然没有降到合理的状态。 它从234MB BGC(在GC.start之前)到197MB AGC。 注意:内存大小不同,因为我在不同的计算机上运行它,但具体大小与相对增加和减少(或非减少)无关。

在Ruby on Rails项目中查找内存泄漏

我有一个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。 不幸的是,升级不是一种选择。