2013-07-26 5 views
5

In Ruby 1.9.3, sto usando ObjectSpace per ispezionare il problema di memoria. ObjectSpace.count_objects restituisce un hash, che assomiglia a:Qual è il significato di ciascun valore di hash in ObjectSpace.count_objects?

{:TOTAL=>1004232, :FREE=>258543, :T_OBJECT=>12519, :T_CLASS=>10318, :T_MODULE=>1330,  
:T_FLOAT=>2024, :T_STRING=>555422, :T_REGEXP=>3543, :T_ARRAY=>68372, :T_HASH=>5399, 
:T_STRUCT=>542, :T_BIGNUM=>8105, :T_FILE=>10, :T_DATA=>44277, :T_MATCH=>6, :T_COMPLEX=>1, 
:T_RATIONAL=>82, :T_NODE=>31973, :T_ICLASS=>1766} 

Che cosa significa ogni valore di hash? E soprattutto, perché: TOTAL rimane invariato per un lungo periodo? Significa che non viene creato nessun nuovo oggetto?

Ho visto un similar posting, ma nessuna buona risposta ancora.

+0

Possibile duplicato di [Su Ruby 1.9, quali sono i significati delle chiavi hash quando si chiama ObjectSpace.count \ _objects (in particolare: FREE,: T \ _ICLASS,: T \ _DATA e: T \ _NODE)?] (https://stackoverflow.com/questions/3789929/on-ruby-1-9-what-are-the-meanings-of-the-hash-keys-when-calling-objectspace-cou) –

risposta

1
>> ObjectSpace.count_objects 
=> {:TOTAL=>30205, :FREE=>131, :T_OBJECT=>1550, :T_CLASS=>921, :T_MODULE=>31, :T_FLOAT=>7, :T_STRING=>18368, :T_REGEXP=>185, :T_ARRAY=>4 
196, :T_HASH=>254, :T_STRUCT=>1, :T_BIGNUM=>3, :T_FILE=>9, :T_DATA=>1311, :T_MATCH=>84, :T_COMPLEX=>1, :T_NODE=>3121, :T_ICLASS=>32} 
>> class MyClass ; end 
=> nil 
>> ObjectSpace.count_objects 
=> {:TOTAL=>30205, :FREE=>203, :T_OBJECT=>1562, :T_CLASS=>923, :T_MODULE=>31, :T_FLOAT=>7, :T_STRING=>18333, :T_REGEXP=>185, :T_ARRAY=>4 
274, :T_HASH=>268, :T_STRUCT=>1, :T_BIGNUM=>3, :T_FILE=>9, :T_DATA=>1320, :T_MATCH=>97, :T_COMPLEX=>1, :T_NODE=>2956, :T_ICLASS=>32} 
>> MyClass = nil 
(irb):4: warning: already initialized constant MyClass 
(irb):2: warning: previous definition of MyClass was here 
=> nil 
>> ObjectSpace.count_objects 
=> {:TOTAL=>30205, :FREE=>87, :T_OBJECT=>1572, :T_CLASS=>923, :T_MODULE=>31, :T_FLOAT=>7, :T_STRING=>18425, :T_REGEXP=>185, :T_ARRAY=>43 
39, :T_HASH=>279, :T_STRUCT=>1, :T_BIGNUM=>3, :T_FILE=>9, :T_DATA=>1328, :T_MATCH=>107, :T_COMPLEX=>1, :T_NODE=>2876, :T_ICLASS=>32} 
>> MyClass 
=> nil 
>> GC.start 
=> nil 
>> ObjectSpace.count_objects 
=> {:TOTAL=>30205, :FREE=>7356, :T_OBJECT=>1549, :T_CLASS=>921, :T_MODULE=>31, :T_FLOAT=>7, :T_STRING=>14100, :T_REGEXP=>184, :T_ARRAY=> 
3821, :T_HASH=>244, :T_STRUCT=>1, :T_BIGNUM=>3, :T_FILE=>5, :T_DATA=>1285, :T_MATCH=>8, :T_COMPLEX=>1, :T_NODE=>657, :T_ICLASS=>32} 
>> 

Guardando l'oggetto T_CLASS possiamo vedere che questi sono i conteggi. Quando rimuovo la classe e avvio il Garbage Collector, riduce nuovamente il conteggio.

Il valore TOTALE rimanente invariato non può significare che non siano stati creati oggetti, poiché ovviamente quando si crea un nuovo oggetto come MyClass il conteggio non è cambiato. Potrebbe significare che rivaluta il totale solo occasionalmente, non in tempo reale.

Ma, con un po 'di matematica, quando somma i valori e rimuovo il conteggio TOTALE, ottengo TOTAL. Quindi sembra che sia un conteggio del numero di oggetti, che ha senso, quando i rapporti count_objects sul conteggio degli oggetti.

+0

Grazie vgoff, tu ora qual è il significato di Total e Free? Inoltre, se non stai creando hash o array, perché il conteggio continua a cambiare? –

+0

Sei sicuro che i metodi che chiamate non creino oggetti Array o Hash nelle loro implementazioni? Gratuito, non ho guardato, forse è un conteggio che è stato liberato e pronto per GC? Puramente speculazione però GRATIS anche se. – vgoff

+0

Intendo nel tuo esempio che crei solo una classe, giusto? Non array o hash, ma continuano a cambiare. Forse GC sta funzionando? –