Optimisation de code: gérer la mémoire .net plus efficacement
Dans l’univers de .NET, la gestion de la mémoire est automatique. La récupération de mémoire non utilisée s’exécute en arrière plan, et permet au développeur de se concentrer davantage sur les tâches concrètes que sur le travail de plomberie. La première partie de ce duo d’articles consacré à la récupération automatique de place en mémoire (garbage collection), expliquait le fonctionnement de ce ramasse-miettes dans .NET. Dans ce second volet, j’étudierai les interfaces qui s’offrent au développeur pour faciliter et contrôler la récupération automatique de place en mémoire.
Le modèle de conception Dispose: IDisposable, Dispose et Finalize
Le moteur CLR (Common Language Runtime) ne peut pas libérer des ressources telles que des connexions de bases de données ou des descripteurs de fenêtres et de fichiers. Il est donc nécessaire que le développeur fournisse des mécanismes permettant de nettoyer ces ressources non gérées. Ce nettoyage peut être implémenté dans la méthode Finalize. Celle-ci est implémentée en tant que destructeur dans le langage C#. L’appel de la méthode Finalize reste sous le contrôle du mécanisme de récupération de place.
D’ordinaire, vous auriez besoin d’une méthode déterministe pour libérer les ressources non gérées comme les descripteurs de fichiers. Par exemple, si vous avez ouvert un fichier en lecture et avez fini d’en charger le contenu dans une mémoire tampon, peut-être souhaiterez vous fermer de manière explicite le descripteur de fichier. Pour cette libération explicite, .NET fournit le modèle de conception Dispose.
Les objets nécessitant une libération explicite des ressources non gérées implémentent l’interface IDisposable. Cette dernière est constituée de la méthode Dispose qui, contrairement à la méthode Finalize, est contrôlée par le