13

Sto usando GC.stat per l'utilizzo della memoria profilo nella nostra app Rails. GC.stat restituisce un hash con i seguenti tasti:Che cosa significano i campi di GC.stat di Ruby?

:count 
:heap_used 
:heap_length 
:heap_increment 
:heap_live_num 
:heap_free_num 
:heap_final_num 

Qualcuno sa esattamente che cosa significano questi valori? Non c'è documentazione su di essi nella sorgente Ruby (gc.c), solo un commento: "I contenuti dell'hash sono definiti dall'implementazione e potrebbero essere modificati in futuro."

Alcuni di questi campi hanno senso dal contesto, ad es. count è il numero di heap a cui è stato assegnato Ruby. Ma cos'è heap_final_num? Che cos'è heap_increment? heap_length la dimensione minima dell'heap?

sto a giocherellare con RUBY_MIN_HEAP_SLOTS, RUBY_FREE_MIN e RUBY_GC_MALLOC_LIMIT, ma cambiando quegli Vars env non sembra avere alcun effetto sul :heap_count o :heap_length. Mi aspetterei che lo :heap_count si riduca se aumenti radicalmente gli slot di heap min. Quindi mi piacerebbe davvero sapere esattamente cosa rappresentano tutti i valori GC.stat!

Sto usando Ruby 1.9.3.

risposta

12

:count - il numero di cicli gc, ad es. quante volte è stato eseguito gc

:heap_used - il numero di heap allocati, rubino crea un mucchio di default e di aumentare il numero di heap se non è sufficiente per allocare tutti gli oggetti

:heap_length - la dimensione del mucchio. Questa è la prima dimensione dell'heap. Idealmente si dovrebbe avere un mucchio dopo script di avvio

:heap_increment - il numero che sarebbe stato aggiunto all'ultima dimensione heap se rubino crea nuovo heap

:heap_live_num - quanti slot di heap vengono assegnati

:heap_free_num - come molti slot heap sono liberi

:heap_final_num - finalizzatori di slot numero

Hai ragione che aumentando RUBY_MIN_HEAP_SLOTS il numero di heap dovrebbe diminuire fino a uno. Ma più alto è il RUBY_FREE_MIN più heap avrai. Indica il numero di slot liberi che dovrebbe avere l'heap corrente, se quel numero è inferiore a quello che hai fornito - ruby ​​crea un nuovo heap. RUBY_GC_MALLOC_LIMIT è più correlato alla frequenza con cui Ruby esegue il processo GC e non influisce direttamente sul numero di heap. Questo contatore indica dopo quanti mallocs ruby ​​eseguire GC. Ma può essere eseguito anche prima. Si noti che non si tratta di allocazioni di ruby ​​obj, ma di un contatore malloc interno di ruby ​​globale incrementato su qualsiasi allocazione di obj interno all'interprete ruby.

+0

le informazioni in questa risposta non è accurate..see [questo post] (http://samsaffron.com/archive/2013/11/22/demystifying-the-ruby-gc) per la risposta corretta. – tihom

0

Sembra a me come : contano è il numero di 'spazzata pigra' cicli GC, non GC piena cicli su Ruby MRI 1.9.3p448.

ho dovuto forzare un GC pieno prima della profiler ha riportato eventi GC:

GC::Profiler.enable 
GC.start 
GC::Profiler.report