[ruby-dev:49171] [Ruby trunk - Bug #11332] Arrayの操作でcrubyインタプリタのメモリリークが起きる
From:
s.wanabe@...
Date:
2015-07-04 15:15:20 UTC
List:
ruby-dev #49171
Issue #11332 has been updated by _ wanabe.
`ruby -e 'loop { [1, 2, 3, 4].tap(&:pop).sort! }'` とすると、同じ現象と思われるメモリ増加が確認できました。
(ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin14])
`loop { [1, 2, 3, 4, 5].tap(&:pop).sort! }` でも `loop { [1, 2, 3].tap(&:pop).sort! }` でもメモリ増加は見られなかったので、
`RARRAY_EMBED_FLAG` や `rb_ary_modify()` などが関係あるのかもしれない、という気がします。
----------------------------------------
Bug #11332: Arrayの操作でcrubyインタプリタのメモリリークが起きる
https://bugs.ruby-lang.org/issues/11332#change-53282
* 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/