gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 06:50:18 26 4
gpt4 key购买 nike

我在循环中使用 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

最佳答案

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

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

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

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

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

关于ruby - 分配给 "lib/ruby/2.1.0/timeout.rb"的 1GB 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33658542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com