分配给 "lib/ruby/2.1.0/timeout.rb" 的 1GB 内存

1GB memory allocated to "lib/ruby/2.1.0/timeout.rb"

我在循环中使用 Twitter、Mongo 和 Parallel 来检索和存储数据。

内存利用率达到 1.5GB+

GC 怎么不清理这个?

更新: Here is the script in question.

allocated memory by location
-----------------------------------
 973409328  /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/timeout.rb:82
 359655091  /Users/jordan/.rvm/gems/ruby-2.1.5/gems/json-1.8.3/lib/json/common.rb:155
  34706221  /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/openssl/buffering.rb:182
  31767589  /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/net/http/response.rb:368
  22055648  /Users/jordan/.rvm/gems/ruby-2.1.5/gems/parallel-1.6.1/lib/parallel.rb:183
  12129637  /Users/jordan/.rvm/gems/ruby-2.1.5/gems/addressable-2.3.8/lib/addressable/uri.rb:525
  11115133  /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/net/protocol.rb:172
  10609088  /Users/jordan/.rvm/gems/ruby-2.1.5/gems/addressable-2.3.8/lib/addressable/idna/pure.rb:177
   8333448  /Users/jordan/.rvm/gems/ruby-2.1.5/gems/twitter-5.15.0/lib/twitter/base.rb:152
   6041744  /Users/jordan/.rvm/gems/ruby-2.1.5/gems/thread_safe-0.3.5/lib/thread_safe/non_concurrent_cache_backend.rb:8
   4857232  /Users/jordan/.rvm/gems/ruby-2.1.5/gems/addressable-2.3.8/lib/addressable/uri.rb:1477
   4583920  /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/monitor.rb:241
   4524872  /Users/jordan/.rvm/gems/ruby-2.1.5/gems/memoizable-0.4.2/lib/memoizable/method_builder.rb:117
   4282752  /Users/jordan/.rvm/gems/ruby-2.1.5/gems/twitter-5.15.0/lib/twitter/base.rb:151
   4200641  /Users/jordan/.rvm/gems/ruby-2.1.5/gems/mongo-2.1.1/lib/mongo/monitoring/command_log_subscriber.rb:104
   3283047  /Users/jordan/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/net/http/response.rb:61
   3150696  /Users/jordan/.rvm/gems/ruby-2.1.5/gems/mongo-2.1.1/lib/mongo/server/monitor.rb:125


allocated memory by gem
-----------------------------------
1084770550  ruby-2.1.5/lib
 359655091  json-1.8.3
  53016839  addressable-2.3.8
  22069048  parallel-1.6.1
  18422826  twitter-5.15.0
  10829988  mongo-2.1.1
   8908392  memoizable-0.4.2
   6041744  thread_safe-0.3.5
   4904294  faraday-0.9.2
   3839455  other
   3382080  naught-1.1.0
   2429320  bson-3.2.6
   1123917  rubygems
    320962  rollbar-2.4.0
    205097  activesupport-4.2.4
     20005  multi_json-1.11.2

您正在加载 数据(取决于您有多少用户),然后并行休眠 20 秒.所以基本上,如果您有一百个用户,您将同时检索 100 个用户的推特数据,然后休眠,再做一次,依此类推。此内存可能看起来像是归因于超时进程,因为在 20 秒睡眠期间由它负责。

尝试将您使用的线程数从 keys.length 减少到只有几个(玩弄数字)

Ruby 内存管理既优雅又繁琐。它将对象(名为 RVALUEs)存储在大小约为 16KB 的所谓堆中。在低级别上,RVALUE 是一个 c 结构,包含不同标准 ruby 对象表示的联合。

所以,堆存储RVALUE个大小不超过40字节的对象。对于 StringArrayHash 等对象,这意味着小对象可以放入堆中,但一旦它们达到阈值,就会在 Ruby 将分配堆。

这个额外的内存是灵活的;一旦对象被 GC 处理,它就会被释放。但是堆本身不再释放到 OS。

就是说,一旦您将许多 字符串同时加载到 ruby 内存中,堆数量就会增加,并且此内存永远不会返回到 ruby.这听起来可能很奇怪,但请尝试 而不是 来存储 字符串,短于 23 个符号 。太疯狂了,对提议感到抱歉:)

这也可能有帮助:http://www.sitepoint.com/ruby-uses-memory/