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

Jor*_*ein 9 ruby parallel-processing memory-leaks mongodb

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

内存利用率达到1.5GB +

GC怎么不清洗这个?

更新: 这是有问题的脚本.

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
Run Code Online (Sandbox Code Playgroud)

Ale*_*kin 3

Ruby 内存管理既优雅又麻烦。它将对象(名为RVALUEs)存储在大小约为 16KB 的所谓堆中。在低层次上,RVALUE是一个c-struct,包含不同标准 ruby​​ 对象表示的联合。

\n\n

因此,堆存储RVALUE对象,其大小不超过40字节。对于诸如StringArray等对象Hash,这意味着小对象可以放入堆中,但一旦它们达到阈值,就会在 Ruby 堆之外分配额外的内存。

\n\n

这个额外的内存是灵活的;一旦对象成为 GC\xe2\x80\x99ed,它就会被释放。但堆本身不再发布到操作系统。

\n\n

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

\n\n

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

\n