172 votes

Comment forcer l'exécution du garbage collector ?

L'interviewer m'a posé la question aujourd'hui... y a-t-il une réponse ?

6 votes

Cette question contient de bonnes informations sur les raisons pour lesquelles vous ne devriez pas le faire : stackoverflow.com/questions/118633/

1 votes

Pourquoi tu dis ça comme ça

0 votes

La partie "Comment" est bien moins importante que la partie "Pourquoi" (ne pas) la remettre en question.

216voto

Karthik Ratnam Points 715

System.GC.Collect() force le collecteur d'ordures à fonctionner. Ceci n'est pas recommandé mais peut être utilisé si la situation se présente.

22 votes

Pourquoi n'est-il pas recommandé ?

9 votes

GC.Collect() est coûteux à exécuter. Il est déconseillé de le faire plus que nécessaire. Le code pour savoir quand il doit être appelé est bien écrit. Normalement, vous ne devriez faire une collecte automatique que dans des cas limites spécialisés. stackoverflow.com/a/21961777/2710988

208voto

Saurabh Points 11097

Il n'est pas recommandé d'appeler gc explicitement, mais si vous appelez

GC.Collect();
GC.WaitForPendingFinalizers();

Il appellera GC explicitement dans tout votre code, n'oubliez pas d'appeler GC.WaitForPendingFinalizers(); après GC.Collect() .

16 votes

WaitForPendingFinalizers n'offre pas nécessairement de "meilleures performances" : il bloque simplement jusqu'à ce que tous les objets de la file d'attente de finalisation aient été finalisés (objets qui auraient pu être placés là par votre appel précédent à la fonction Collect ). Si vous voulez que ces objets aient une chance d'être collectés, vous devez un autre Appel à Collect après en appelant WaitForPendingFinalizers .

2 votes

Puisque l'une des rares bonnes raisons d'appeler gc.Collect est un ultime effort pour libérer les ressources qui n'ont pas été correctement éliminées, WaitForPendingFinalizers semble être une étape nécessaire. Je ne suis pas sûr de la meilleure pratique à adopter pour éviter d'appeler gc.Collect de manière excessive dans de tels cas, cependant. BTW, je me demande s'il y a une raison technique pour laquelle gc.Collect "doit" promouvoir les générations ? Il semblerait plus utile que les générations restent en place à moins que suffisamment de choses aient été allouées dans l'une d'elles pour justifier son avancement.

3 votes

Note pour les débutants en C# (comme moi) : Le GC force call ne garantit pas qu'un objet concret inutilisé soit retiré de la mémoire. (une façon de le faire est d'utiliser la "déclaration d'utilisation" ( msdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx ))

19voto

GC.Collect() 

de MDSN ,

Utilisez cette méthode pour essayer de récupérer toute mémoire qui est inaccessible.

Tous les objets, quelle que soit leur durée ils ont été en mémoire, sont considérés pour la collecte ; cependant les objets qui sont référencés dans du code ne sont pas collectés. Utilisez cette méthode pour forcer le système à essayer de de récupérer la quantité maximale de mémoire disponible.

14voto

max Points 16106

13voto

Justin Niessner Points 144953

GC.Collect();

N'oubliez pas, cependant, que le Garbage Collector ne nettoie pas toujours ce que vous attendez...

6 votes

Qu'est-ce que vous entendez par là ? Qu'est-ce que ça pourrait nettoyer de manière inattendue ?

6 votes

@Voldemort - Il ne nettoierait rien de façon inattendue. Mais il se peut qu'il ne nettoie pas tout ce que vous attendez de lui.

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