😎

Ruby でメモリの使用量を調べる

に公開

Ruby で『実行中の Ruby で消費しているメモリの使用量』を調べたい場合に ObjectSpace.#memsize_of_all が利用できます。

ObjectSpace.#memsize_of_all では消費しているメモリの使用量をバイト単位で返します。

require "objspace"

# この時点で消費しているメモリの使用量を返す
pp ObjectSpace.memsize_of_all
# => 1898764

# 適当にメモリを消費するようなコードを書くと
(1..10000).map { "a" * _1 }.select { _1.size.even? }.join("-")

# 使用量が増えている
pp ObjectSpace.memsize_of_all
# => 77403654

また、これを応用することで『特定の処理がどれぐらいメモリを消費しているのか』も比較的簡単に検証できます。

require "objspace"

def memory_check
  ObjectSpace.memsize_of_all.then { |start|
    yield
    ObjectSpace.memsize_of_all - start
  }
end


# ブロック内で消費したメモリの使用量が検証できる
result = memory_check {
  "a" * 1000
}
pp result # => 1161

# 逆に GC すれば解放されたメモリの使用量がわかりそう?
result = memory_check {
  GC.start
}
pp result # => -5252

シュッとメモリの使用量を検証したい場合は便利ですね。

注意点としては ObjectSpace.#memsize_of_all は完全な値を返すわけではなくあくまでも『ヒント』レベルの値が返ってきます(厳密な意味で malloc されたメモリの消費量というわけではない
また CRuby 以外の処理系では動作しません。

とはいえ、なんとなく『めっちゃ消費している』とか『メモリの消費が増えた・減った』ぐらいなレベルで検証するのであれば役には立ちそうですかねー。

GitHubで編集を提案

Discussion