13

Estoy usando GC.stat para el uso de memoria de perfil en nuestra aplicación Rails. GC.stat devuelve un hash con las siguientes claves:¿Qué significan los campos de Ruby's GC.stat?

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

¿Alguien sabe exactamente lo que significan estos valores? No hay documentación de ellos en la fuente de Ruby (gc.c), solo un comentario: "El contenido del hash está definido por la implementación y puede cambiarse en el futuro".

Algunos de estos campos tienen sentido desde el contexto, p. count es la cantidad de montones que Ruby ha asignado. ¿Pero qué es heap_final_num? ¿Cuál es heap_increment? ¿Es heap_length el tamaño de pila mínimo?

estoy jugando con RUBY_MIN_HEAP_SLOTS, RUBY_FREE_MIN y RUBY_GC_MALLOC_LIMIT, pero cambiando los VARs env no parece tener ningún efecto sobre :heap_count o :heap_length. Esperaría que :heap_count cayera si aumentara radicalmente las ranuras mínimas. ¡Entonces realmente me gustaría saber exactamente qué representan todos los valores de GC.stat!

Estoy usando Ruby 1.9.3.

Respuesta

12

:count - la cantidad de ciclos de gc, p. ¿cuántas veces se ha ejecutado gc

:heap_used - el número de montones asignados, rubí crea un montón de forma predeterminada y aumentar el número montón si no es suficiente para asignar todos los objetos

:heap_length - el tamaño del montón. Ese es el primer tamaño de montón. Lo ideal es tener un montón después de script de inicio

:heap_increment - el número que se añade a la última tamaño de la pila si rubí crea nueva montón

:heap_live_num - ¿Cuántas ranuras de almacenamiento dinámico se asignan

:heap_free_num - cómo muchas ranuras del montón son libres

:heap_final_num - finalizadores ranuras de número

Tienes razón en que al aumentar RUBY_MIN_HEAP_SLOTS el número de montones debería disminuir a uno. Pero cuanto mayor sea RUBY_FREE_MIN, más montones obtendrá. Indica el número de espacios libres que debe tener el montón actual, si ese número es menor que el que proporcionó, ruby ​​crea un nuevo montón. RUBY_GC_MALLOC_LIMIT está más relacionado con la frecuencia con la que Ruby ejecutaría el proceso de GC y no afecta directamente al número de montones. Este contador indica después de cuántos mallocs ruby ​​ejecutaría GC. Pero puede ejecutarse incluso antes. Tenga en cuenta que no se trata de asignaciones de obj ruby, sino de contador interno de rublo interno de malloc que se incrementa en cualquier asignación interna de obj de ruby.

+0

la información de esta respuesta no es accurate..see [este post] (http://samsaffron.com/archive/2013/11/22/demystifying-the-ruby-gc) para la respuesta correcta. – tihom

0

A mi me parece como : contar es el número de 'barrido perezoso' ciclos GC, GC no completa ciclos en Rubí MRI 1.9.3p448.

tuve que forzar un GC completa antes de que el generador de perfiles informó ningún evento GC:

GC::Profiler.enable 
GC.start 
GC::Profiler.report 
Cuestiones relacionadas