3 votes

Pourquoi les objets envoyés avec send_data semblent-ils être conservés en mémoire ?

Je construis une application Rails (5.0.4, Ruby 2.3.3) qui crée un fichier PDF avec Prawn, et l'envoie à l'utilisateur, en utilisant send_data de ActionController, comme ceci :

 # data is a Prawn document    
 send_data data, type: 'application/pdf', disposition: 'inline', filename: 'document.pdf'

J'ai remarqué sur Heroku que l'application semble utiliser de plus en plus de mémoire avec chaque document qui est créé et envoyé. J'ai confirmé cela sur ma machine locale avec quelques tests grossiers. Maintenant, j'ai placé GC.start après le send_data appel et le problème semble être résolu. La mémoire revient toujours à un niveau stable.

Mes questions sont les suivantes : est-ce que send_data de faire quelque chose pour que l'objet reste en place longtemps ? Et le ramasseur d'ordures n'est-il pas censé fonctionner "tout seul" de temps en temps ? Heroku montre une augmentation constante de la mémoire. Merci.

2voto

Segfault Points 3311

Le GC ne s'exécutera que lorsque le système subit une certaine pression de la mémoire, plus précisément lorsque l'option heap_free_slots sont épuisés. Vous pouvez voir combien sont disponibles avec GC.stat . Étant donné que vous ne payez généralement pas pour la mémoire utilisée avant de l'avoir épuisée, il n'y a guère d'intérêt à essayer de libérer de l'espace prématurément. Ainsi, le maximum d'espace peut être récupéré en un minimum d'invocations du ramasseur d'ordures.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X