K.Sasada's Home Page

こめんとのついか

こめんとこめんと!

message

please set comment :).

_6(Fri)

■Ruby 2.1 internal advent calendar 6 日目

今日は、ObjectSpace の新メソッド・2.1 の目玉の 1 つと思って居る ObjectSpace.trace_object_allocations についてご紹介します。

    * ObjectSpace.trace_object_allocations
    * ObjectSpace.trace_object_allocations_start
    * ObjectSpace.trace_object_allocations_stop
    * ObjectSpace.trace_object_allocations_clear
    * ObjectSpace.allocation_sourcefile
    * ObjectSpace.allocation_sourceline
    * ObjectSpace.allocation_class_path
    * ObjectSpace.allocation_method_id
    * ObjectSpace.allocation_generation

この辺がひとまとまりなんですが、とりあえず、標準的な話を書いてみます。


ObjectSpace.trace_object_allocations に渡すブロック中で生成したオブジェクトの生成タイミングの情報をとっておくことが出来ます。

現在、取っておくことが出来るのは、次の「どこで、いつ」生成されたか、という情報です。

論より証拠として、何が出来るかを紹介します。

require 'objspace'

def where_are_you_from? obj
  file = ObjectSpace.allocation_sourcefile(obj)
  line = ObjectSpace.allocation_sourceline(obj)
  "#{file}:#{line}" if file && line
end

ObjectSpace.trace_object_allocations{
  $a = a = Object.new # t.rb:10 行目で作成
  b = Object.new # t.rb:11 行目で作成

  p where_are_you_from?(a) #=> "t.rb:10"
  p where_are_you_from?(b) #=> "t.rb:11"
}
c = Object.new # t.rb: 16 行目で作成

p where_are_you_from?($a) #=> "t.rb:10"
p where_are_you_from?(c) #=> nil

ObjectSpace.trace_object_allocations_clear
p where_are_you_from?($a) #=> nil

ObjectSpace.trace_object_allocations に渡したブロック中で、a ($a), b というオブジェクトを作成しています。

作成したオブジェクトに対して where_are_you_from?() を呼び出すと、"t.rb:10" のように、作成された場所のファイル名、および行番号の文字列を返すことが出来ます。

ブロックを出た後では、オブジェクト生成時情報は保存されませんので、ブロックを出た後作成した c を見ても、場所を返してくれません(単に nil になっています)。

このブロックを出た後も、$a を見ると、正しい場所を返しています。これは、保存している情報が残っているからです。

しかし、ObjectSpace.trace_object_allocations_clear を呼び出すと、保存しているすべての情報を破棄するので $a の情報は見えなくなります。これ以降情報は不要だ、と判断できるタイミングで、適切に破棄すると良いと思います。

情報は次の API で取得することが出来ます。

ちなみに、ObjectSpace.trace_object_allocations は、渡されたブロックの中で取得を有効にします。他にも、ObjectSpace.trace_object_allocations_start で取得スタート、ObjectSpace.trace_object_allocations_stop でストップ、のように使うことが出来ます。

つまり、ObjectSpace.trace_object_allocations は次の定義されます。

def ObjectSpace.trace_object_allocations 
  begin
    ObjectSpace.trace_object_allocations_start
    yield
  ensure
    ObjectSpace.trace_object_allocations_stop
  end
end

とても便利な機能だと思うんですが、デメリットとして、オブジェクトの生成・廃棄がとても遅くなってしまいます。なので、デバッグ用途・プロファイリング用途で利用されるといいんじゃないかと思います。


もう 1 つ大事な点は、この新機能は、実はサンプル機能として追加した、という点です。後日ちゃんと紹介しますが新しい TracePoint のイベントを利用しています。というわけで、似たような感じで、もっといろいろ作れるんじゃ無いかと思います。

_kou(Sun Dec 15 11:02:12 +0900 2013)

 sourcefileとsourcelineのsourceの後に「_」がないことに違和感を感じました。

_ささだ(Sun Dec 15 13:03:57 +0900 2013)

 rb_sourceline, rb_sourcefile に引っ張られています。どうしたものかな。


好きにコメントを編集してください。ただし、あまり他の人のコメントを書き換えることは感心しません。



back

tton 記述が使えます。YukiWikiな記述してりゃ問題ありません。

「行頭に#code」 と、「行頭に#end」 で挟むと、その間の行は pre で囲まれます。プログラムのソースを書くときに使ってください。

例:

#code

(なんかプログラム書く)

#end

リンクは

[[なまえ|http://www.example.org]]

とか

[[http://www.example.org]]

で貼れます。

$Date: 2003/04/28 10:27:51 $