Recolección de basura Ruby

¿Cuándo utilizaría este método de recolección de basura en su (s) progtwig (s) de Ruby?

GC.start 

Hay ocasiones en las que es necesario iniciarlo, pero por lo general funciona bien por sí solo. He tenido situaciones en las que una aplicación masticará 1 GB de memoria si no se controla, presionando profundamente en el intercambio, donde la activación de GC.start forma intermitente lo reducirá a 100MB.

El problema es que llamar a este método es muy costoso y puede ralentizar considerablemente la aplicación si se usa agresivamente.

Cuando el benchmarking

Estoy comparando algunos códigos que crean muchos objetos, y noté que mis puntos de referencia varían enormemente. Determiné que los picos eran de recolección de basura que se ejecutaba durante mi punto de referencia .

Controlar el proceso manualmente me da puntos de referencia más consistentes.

 def without_gc GC.start # start out clean GC.disable yield GC.enable end without_gc do Benchmark.measure { some_code } end 

Dicho esto, GC.start causará desaceleraciones significativas si lo ejecutas repetidamente.

Lo uso cuando itero a través de una gran cantidad de elementos en entornos con limitaciones de memoria (Heroku): GC.start un GC.start cada 100 elementos aproximadamente.

Generalmente desanimado a menos que tenga alguna necesidad especial. Ex. A veces, durante el análisis de la memoria, es útil forzar una CG para una mejor previsibilidad.

Ejemplo de la vida real:

Al probar un transmisor JSON , quiero asegurarme de que el consumo de memoria permanezca bajo. Por lo tanto, necesito ejecutar GC.start antes de los casos de prueba o, de lo contrario, se vuelven impredecibles e incluso pueden producir falsos positivos.

Al cargar un CSV con 100k líneas es una necesidad. De lo contrario, un servidor se queda sin memoria y los datos no se cargan. Consulte https://stackoverflow.com/a/52722689/6594668