Fuites mémoire … disparues ?

Tout ceux qui ont utilisé Gramps pendant une longue période auront noté que la mémoire nécessaire à Gramps augmente après un certain temps. C’est une conséquence de l’utilisation de GTK depuis python, le récupérateur de mémoire est incapable de récupérer les objets orphelins. Une question très technique. L’utilisation de glade est spécialement gênante, car il n’est pas clair pourquoi certains objets génèrent des fuites mémoire et d’autres non.

Cependant, il existe des solutions simples pour aider le récupérateur de mémoire dans son travail: enlever les liens internes vers les méthodes, supprimer les attributs de l’objet qui stockent les objets glade GTK, nettoyer les dictionnaires et listes stockant les pointeurs vers les méthodes ou objets.

Le problème étant que nous avons besoin d’un emplacement bien défini pour le stockage nécessaire au récupérateur de mémoire, surtout, une méthode que nous saurons appeler. Un tel emplacement a été maintenant ajouté. Les modèles ont maintenant une méthode pour détruire vers un ensemble destiné au récupérateur de mémoire. Chaque fois qu’une vue, qu’un sélecteur, que des onglets créent un nouveau modèle (par exemple après avoir utilisé un filtre), le précédent modèle doit être détruit de cette façon.

De même, nous avions déjà une méthode _cleanup_db_connects sur les éléments de l’interface utilisateur (GUI), celle-ci a été associée avec une méthode _cleanup_local_connects et une méthode _cleanup_on_exit. Ces méthodes de nettoyage enlèvent les rappels de connexion pour l’interface utilisateur, la dernière méthode était déjà présente sur certains éléments de 3.2.4 et a été maintenant étendue vers plus d’objets, tels que les onglets (displaytabs) des éditeurs. La méthode _cleanup_on_exit est appelée après que la fenêtre GTK window a été détruite, ceci devra encore être finalisé dans tous les liens qui entravent la collecte du récupérateur de mémoire.

La séquence typique d’un élément est donc:

 def close(self):
   self._cleanup_db_connects()
   self._cleanup_connects()
   ManagedWindow.close(self) 
   self._cleanup_on_exit()
   #now do callback if needed to the caller of this window
   self.caller_callback_on_close

Ci-dessus, _cleanup_connects appelle _cleanup_local_connects, et ManagedWindow.close appelle la destruction de la fenêtre GTK du haut, ainsi que la suppression des références de l’interface utilisateur (GUI), lesquelles ont été marquées via la méthode track_ref_for_deletion défini dans la classe ManagedWindow.

Ces changements apparaîtront dans la version 3.2.5, des améliorations plus poussées seront dans la future version 3.3. Maintenant espérons que cela fera des heureux parmi les utilisateurs.

Benny

2 Comments

Join the Conversation!