J'ai une liste appelée Population
, est une excellente liste de très nombreux postes et à un moment donné, je cesse de l'utiliser. Comment puis-je libérer les ressources? Ensuite, cela fait partie du code:
private List <BasePopulation> Population=new List <BasePopulation>();
Population.SomeMethod();
Population.Clear();
J'ai utilisé la méthode Clear, mais ne fonctionne pas. Une idée?
Le problème peut être que Clear
ne fait pas ce que vous pensez. Clear
marque simplement le List
comme étant vide sans redimensionner le tableau interne qu'il utilise en arrière-plan. Il supprimera cependant toutes les références aux instances BasePopulation
individuelles. Donc, si aucune autre structure de données ne leur fait référence, elles seront éligibles pour la collecte des ordures. Mais, cela pas réduira directement la taille du List
. Je viens de le vérifier en utilisant ILSpy.
Vous avez deux options.
Ensemble Population = null
. Cela détraquera l'instance d'objet entière, ce qui la rendra éligible pour la récupération de place.
Appelez TrimExcess
sur ce List
. Cela redimensionnera le tableau interne.
Eh bien, puisque le garbage collector (GC) s'occupe de la gestion de la mémoire pour vous, la première chose que vous pouvez faire est de vous débarrasser de toutes les références à la liste (et aux éléments contenus) afin que le GC soit capable de la supprimer sur la prochaine fois. Vous pouvez le faire, par exemple, en définissant explicitement
Population = null;
Si cela ne vous suffit pas, par exemple parce que vous êtes vraiment désireux de vous débarrasser des objets maintenant et vous pouvez accepter un comportement d'exécution non optimal, vous pouvez dire au GC de commencer à collecter les objets maintenant via
GC.Collect();
Plus d'informations sur cette méthode peuvent être trouvées ici .
Comme indiqué ci-dessus, cette pratique peut induire une baisse des performances car elle oblige le GC à nettoyer les ressources à un point du programme où il ne le ferait généralement pas. L'appel direct de la méthode est donc souvent déconseillé, mais il pourrait répondre à vos besoins si c'est vraiment un point spécial dans votre application. À titre d'exemple pratique, j'ai réussi à améliorer l'utilisation maximale de la mémoire dans un programme qui nécessite beaucoup d'objets lors d'une initialisation qui peuvent être ignorés une fois le l'exécution du programme a commencé. Ici, la petite pénalité de performance pour appeler GC.Collect()
après l'initialisation était justifiable.
La meilleure chose que vous puissiez faire n'est rien. Garbage Collector GC fait ce travail automatiquement pour vous. Puisque List n'est pas IDisposable
, vous ne pouvez pas le supprimer.
Clear
supprimerait simplement les éléments de la liste mais ne les supprimerait pas.