Ruby Memory Validator должен быть в состоянии осуществить это, но это не бесплатно.
Аман Гупта исправлен Джо Даматос memprof но, похоже, это работа в процессе , и я так и не смог запустить ее на своей машине. У Джо есть несколько действительно хороших сообщений о memprof и других материалах низкого уровня в его блоге .
Теперь я не уверен, что они действительно могут. Целые числа хранятся как Fixnum
, а Fixnum
не является обычным объектом Ruby, это выглядит просто так. Ruby использует хитрый трюк ускорения с object_id
, чтобы заставить Fixnum
объекты иммидизировать значения. Номер фактически хранится в самом object_id
. Вот почему два разных Fixnum, содержащие одно и то же значение, имеют одинаковые object_id
.
>> x=5
=> 5
>> y=5
=> 5
>> x.object_id
=> 11
>> y.object_id
=> 11
>> z=4711
=> 4711
>> z.object_id
=> 9423
object_id
из Fixnum
фактически создается путем смещения бита влево и затем установки младшего значащего бита.
5
равно 0b101
, а object_id
для 5
равно 11
и 11
в двоичном виде равно 0b1011
.
4711
равно 0b0001001001100111
, сдвиньте влево и установите бит, и вы получите 0b0010010011001111
, а это 9423, что на z
выше *1043*.
Такое поведение , скорее всего, зависит от конкретной реализации, но я не знаю реализации Ruby, которая не обрабатывает Fixnum таким образом.
В Ruby есть еще как минимум три непосредственных объекта, это false
, true
и nil
.
>> false.object_id
=> 0
>> true.object_id
=> 2
>> nil.object_id
=> 4