web-dev-qa-db-fra.com

Comment libérer de la mémoire utilisée par une grande liste en C #?

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?

25
Esneyder

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.

  1. Ensemble Population = null. Cela détraquera l'instance d'objet entière, ce qui la rendra éligible pour la récupération de place.

  2. Appelez TrimExcess sur ce List. Cela redimensionnera le tableau interne.

31
Brian Gideon

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.

8
bigge

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.

2
Krishna