nil

Rubyの勉強しています。いろいろと教えてください。

Rubyのオブジェクトのメモリについて

この前こんな記事書きました。yoskmr.hatenablog.com
オブジェクトのメモリの使用量を調べるモジュールありますよという記事です。この時に謎のままにしていた以下のコードの2行目の「GC::INTERNAL_CONSTANTS[:RVALUE_SIZE]」すが、調べたら正体がわかったので書きます。
結論から言うと、「ヒープ領域に格納したRubyオブジェクトのポインタのメモリサイズ」です。では説明していきます。

require 'objspace'
rvalue_size = GC::INTERNAL_CONSTANTS[:RVALUE_SIZE]

Rubyのオブジェクトはヒープ領域で値型変数にポインタとして格納される

※値型=VALUE Type、これともう一つ、参照型=Reference Typeてのがあります。
詳しくはこちら→ 値型と参照型 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C

Rubyの話だったけど、ほとんどCの話になります笑
f:id:yoskmr:20151208011040j:plain
図1:Rubyでのメモリ領域
引用:http://www.is.titech.ac.jp/~sassa/lab/papers-written/08M37090-oota.pdf

Rubyのオブジェクト領域(図1でいえばヒープの下の領域)のオブジェクトは全てヒープ領域に値型変数にポインタとして格納されます。ヒープ領域の値型はRVALUEデータ構造という規定になっている(ガーベージコレクションやデータ型の情報も格納されている)らしい。

Rubyのオブジェクトのメモリサイズ

上記のことをふまえ、下のコードを確認してみましょう。

require 'objspace'
rvalue_size = GC::INTERNAL_CONSTANTS[:RVALUE_SIZE]

num = 1
p ObjectSpace.memsize_of(num)
# => 0
p ObjectSpace.memsize_of(num) + rvalue_size
# => 40

str = 'a'
p ObjectSpace.memsize_of(str)
# => 40
p ObjectSpace.memsize_of(str) + rvalue_size
# => 80

やっと本題ですね。
「objspace」というモジュールを使用して、オブジェクトのメモリサイズを調べられるのですが、numもstrも、それぞれmemsize_ofメソッドだけの時と、rvalue_seize(GC::INTERNAL_CONSTANTS[:RVALUE_SIZE])をプラスした時でメモリサイズが違う。これはmemsize_ofメソッドRuby領域のオブジェクトのメモリサイズしか出力しないからみたいです。では「rvalue_size」は何者かと言うと、先ほど説明したヒープ領域で格納したオブジェクトのポインタです。
つまりこういうことです。

  • 【実際のメモリ】=【Rubyのオブジェクト領域でのメモリ】+【ヒープ領域でのポインタ格納のメモリ】

そこで、もう一つの疑問、numオブジェクトのRubyオブジェクト領域でのメモリサイズがゼロなんだけどどういうこと?です。これは、ガーベージコレクションという動的に確保したメモリのうち、不要になった領域を開放するという機能を最適化するための例外です。どういった例外かというと、「Fixnumオブジェクト,Symbolオブジェクト,true,false,nilオブジェクト」は関しては他のオブジェクトと違って扱い方を例外にしますということである。他のオブジェクトはヒープ領域にRVALUEデータ構造(ポインタ)として値型に格納されますが、例外のオブジェクトは値型には直接格納しちゃいましょうという仕様である。Fixnumオブジェクトの整数の「1」もオブジェクトであるが「1」のためにRubyオブジェクト領域にメモリを確保するのはガーベージコレクションの処理では非効率になることらしい。なので、上記コードの整数であるnumはmemsize_ofメソッドではメモリがゼロになったのである。

参考

以下のサイト、論文を参考にしました。感謝です。
http://www.is.titech.ac.jp/~sassa/lab/papers-written/08M37090-oota.pdf (Rubyにおけるメモリ管理改善手法の提案)
http://www.atdot.net/~ko1/activities/rubyfp2008.pdf (Ruby処理系での軽量な浮動小数点数表現 )
ガベージコレクション
第5章 ガ−ベージコレクション

postd.cc