Ruby Memory Validator debe ser capaz para llevarlo a cabo, pero no es gratis.
Aman Gupta
patched Joe Damatos
memprof pero parece que hay una
work in progress y nunca me dieron para que se ejecute en mi máquina. Joe tiene un par de publicaciones realmente buenas sobre memprof y otras cosas de bajo nivel en su
blog.
Ahora no estoy tan seguro de que realmente puedan hacerlo. Los enteros se almacenan como Fixnum
y Fixnum
no es un objeto Ruby habitual, simplemente se ve de esa manera. Ruby usa un ingenioso truco de aceleración con el object_id
para hacer que Fixnum
modifique los valores de los objetos. El número se almacena en el propio object_id
. Es por eso que dos Fixnum diferentes que contienen el mismo valor tienen el mismo object_id
.
>> x=5
=> 5
>> y=5
=> 5
>> x.object_id
=> 11
>> y.object_id
=> 11
>> z=4711
=> 4711
>> z.object_id
=> 9423
El object_id
de un Fixnum
es en realidad creado por desplazamiento de bits a la izquierda, y luego poner el bit menos significativo.
5
es 0b101
y la object_id
para 5
es 11
y 11
en binario es 0b1011
.
4711
es 0b0001001001100111
, desviación a la izquierda así como el bit y se obtiene 0b0010010011001111
y que es 9423, que pasa a ser el object_id
para z
anteriormente.
This behaviour es muy probablemente una implementación específica, pero no sé de una implementación de Ruby que no maneje Fixnum de esta manera.
Hay al menos otros tres objetos más en Ruby y eso es false
, true
y nil
.
>> false.object_id
=> 0
>> true.object_id
=> 2
>> nil.object_id
=> 4
¿Por qué? ¿Que estás tratando de hacer? – SLaks