Let me ask the method naming issue.

    * ObjectSpace.allocation_sourcefile
    * ObjectSpace.allocation_sourceline
    * ObjectSpace.allocation_class_path
    * ObjectSpace.allocation_method_id
    * ObjectSpace.allocation_generation

I wroet an article about ObjectSpace.trace_object_allocation in Japanese
http://www.atdot.net/~ko1/diary/201312.html#d6
and I tried to translate it into English (the end of this mail).

Kou gave me a comment that:
"I feel strange about the method name `sourcefile' and `sourceline',
because it is not `source_file' and `source_line'".

Another gave me a comment that:
"Why not `allocated_xxx' instead of `allocation_xxx'?"

Give me your comments.

* The name of sourcefile and sorceline are based on "rb_sourcefile" and
"rb_sourceline".

* The name of "allocation" is from "trace_object_allocations" (I want to
use same word `allocation').

Thanks,
Koichi

# bike shed party

----
From Ruby 2.1, we can store object allocation related information with
ObjectSpace.trace_object_allocations.

Currently, this feature supports to store the following information
about "where/when".

* Where
  * file name
  * line nmber
  * class name (representing String)
  * method id
* When
  * GC generation
    (This is not about "Genrational GC". It is GC.count at allocation)

See the code:

####
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 # created at t.rb:10
  b = Object.new # created at t.rb:11

  p where_are_you_from?(a) #=> "t.rb:10"
  p where_are_you_from?(b) #=> "t.rb:11"
}
c = Object.new # created at 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
####

This code generate a ($a) and b objects in block passed to
ObjectSpace.trace_object_allocations.

You can know file name and line nubmer using `where_are_you_from?()'
method with a returning string such as "t.rb:10".

When you exit the block, object allocation information is not stored.
This is why we can't see the information of the object `c' (simply
return nil).

Exiting the block, you can see the information about $a, because
allocation information are still remained.

To clear all allocation tracing information, you can use
`ObjectSpace.trace_object_allocations_clear'. After calling this method,
you can't see the information about $a. If you can understand allocation
information is no longer needed, you can call this method.

Information can be ask via the following methods:

* Where
  * file name -> ObjectSpace.allocation_sourcefile
  * line nmber -> ObjectSpace.allocation_sourceline
  * class name (representing String) ->
              ObjectSpace.allocation_class_path
  * method id -> ObjectSpace.allocation_method_id
* When
  * GC generation -> ObjectSpace.allocation_generation

Note that ObjectSpace.trace_object_allocations enables to store
information during given block. We have other methods: start tracing
with ObjectSpace.trace_object_allocations_start, and stop tracing with
ObjectSpace.trace_object_allocations_stop.

Therefore, ObjectSpace.trace_object_allocations can be defined as the
following code:

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

It is very convinient feature. However, it has disadvantage that the
performance of object creation and freeing are very slow. You can use
this feature for debugging and profiling.

There is another important point. This feature is, in fact, the sample
code of using new internal TracePoint API. You can make similar feature
using this internal TracePoint API.
----


-- 
// SASADA Koichi at atdot dot net