2022-03-12 ObjectSpace.#memsize_of / ObjectSpace.#memsize_of_all
ObjectSpace.#memsize_of (Ruby 3.1 リファレンスマニュアル)
戻り値の内容は完全ではない事に注意してください。この内容はあくまでもヒントとして扱う必要があります。特に T_DATA の値は正しくないでしょう。 2.2 以降では RVALUE のサイズを含んだ結果を返します。
require 'objspace'
ObjectSpace.memsize_of 1 #=> 0
ObjectSpace.memsize_of :a #=> 0
ObjectSpace.memsize_of "a"#=> 40
ObjectSpace.memsize_of "a" * 23 #=> 40
ObjectSpace.memsize_of "a" * 24 #=> 65
ObjectSpace.memsize_of([]) #=> 40
ObjectSpace.memsize_of(["a"]) #=> 40
ObjectSpace.memsize_of({}) #=> 40
ObjectSpace.memsize_of({ a: 1 }) #=> 168
What is RVALUE?
MRIの内部では、すべてのRubyオブジェクトは RVALUE というC構造体で表現される。MRIはRVALUEの定義内で共用体を使い、これまでMRIの内部で見てきた RArray, RString, RRegexp のC構造体のすべてを統一的に扱えるようにしている。
RVALUE の構造体定義は gc.c
内部にある。
https://github.com/ruby/ruby/blob/db57b07086f830b18c0671e3a85a7e2a58ef7171/gc.c#L577-L624
詳しくは『Rubyのしくみ』を参照。
See also
ObjectSpace.#memsize_of_all (Ruby 3.1 リファレンスマニュアル)
引数なしで実行するとすべてのクラスのインスタンスのメモリ使用量を返す。
require 'objspace'
ObjectSpace.memsize_of_all #=> 6662700
引数にクラスを指定した場合、指定したクラスのインスタンスのメモリ使用量を返す。
require 'objspace'
class Foo
end
ObjectSpace.memsize_of_all(Foo) #=> 0
ary = []
10.times { ary << Foo.new }
ObjectSpace.memsize_of_all(Foo) #=> 400