From: nobu@... Date: 2015-07-04T23:20:12+00:00 Subject: [ruby-dev:49172] [Ruby trunk - Bug #11332] Arrayの操作でcrubyインタプリタのメモリリークが起きる Issue #11332 has been updated by Nobuyoshi Nakada. `Array#pop`だけで起きるような気がします。 ~~~ $ for i in 1 5 10 100 1000 10000; do echo; echo $i; ruby2.2 -r ./test/lib/memory_status.rb -e "puts m0 = Memory::Status.new; 10000.times{[*1..$i].pop}; GC.start; puts m1 = Memory::Status.new; p m1.rss.fdiv(m0.rss)"; done 1 {size:2536062976,rss:7557120} {size:2536062976,rss:7577600} 1.002710027100271 5 {size:2516140032,rss:7319552} {size:2517188608,rss:8900608} 1.2160044767767209 10 {size:2519285760,rss:7335936} {size:2520334336,rss:9162752} 1.2490228922389726 100 {size:2526625792,rss:7458816} {size:2559131648,rss:22032384} 2.9538714991762767 1000 {size:2518237184,rss:7528448} {size:2612609024,rss:90443776} 12.013601741022851 10000 {size:2517188608,rss:7331840} {size:2636726272,rss:140148736} 19.115083798882683 ~~~ ---------------------------------------- Bug #11332: Arrayの操作でcrubyインタプリタのメモリリークが起きる https://bugs.ruby-lang.org/issues/11332#change-53284 * Author: Makoto Kishimoto * Status: Open * Priority: Normal * Assignee: * ruby -v: * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN ---------------------------------------- きしもとです Array の sort! と、pop または shift の操作を組み合わせると、わずか ですが ruby インタプリタのメモリリークを引き起こすようです。多数回 繰返すと、どんどん大きくなります。 以下のサンプルを手元の環境(FreeBSD/amd64のruby 2.1.6、ruby 2.2.2、 trunk (r51120) )で試すと、どれもインタプリタのプロセスのメモリ サイズが大きくなっていきます(最後はメモリを確保できなくなって 落ちる)。 # ObjectSpace.memsize_of_all で調べるとオブジェクトは増えたり # 大きくなったりはしていません。 # -*- mode:ruby ; coding:utf-8 -*- def sample rg arr = [] sz = 5 + rg.rand(5) i = 0 while i < sz do arr[i] = rg.rand i += 1 end until arr.empty? do arr.sort! arr.pop #arr.shift end end randgen = Random.new 12345 count = 0 while true do sample randgen if (count += 1) > 1000000 then count = 0 p "GC" GC.start end end -- https://bugs.ruby-lang.org/