Comment forcer le garbage collector à s'exécuter?


148

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


3
Cette question contient de bonnes informations sur les raisons pour lesquelles vous ne devriez pas faire cela: stackoverflow.com/questions/118633/…
Hans Olsson

1
pourquoi dites-vous comme ça
Andrew Collins

1
@Jason - Peut-être que l'intervieweur ne voulait pas entendre la solution, mais plutôt obtenir les connaissances et le raisonnement d'Andrew contre le faire, alors cette question pourrait effectivement avoir un sens.
martinstoeckli le

2
@martinstoeckli C'est encore une question terrible. Une personne ayant les connaissances nécessaires lors d'une entrevue stressante ne se rendrait pas compte qu'il s'agit d'une question piège ou ne penserait pas à fournir des informations supplémentaires. Ensuite, la question n'aide pas l'enquêteur à faire la distinction entre une personne possédant les connaissances et une personne sans celles-ci. La question est donc toujours terrible.
James

2
"Quand forcez-vous le ramassage des ordures?" me semble être une bonne question d'entrevue ("Comment": pas tellement). Débutant: je sais pas. Intermédiaire: jamais. Expert: lorsque vous écrivez un test de fuite de mémoire.
mikebridge

Réponses:


188

System.GC.Collect()force le garbage collector à s'exécuter. Ceci n'est pas recommandé mais peut être utilisé si des situations surviennent.


17
Pourquoi n'est-ce pas recommandé?
Luke T O'Brien

5
GC.Collect () est coûteux à exécuter. Faire plus que nécessaire est déconseillé. Le code pour savoir quand il doit être appelé est bien écrit. Vous ne devez normalement collecter vous-même que dans des cas spéciaux. stackoverflow.com/a/21961777/2710988
Brandon Barkley

187

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().


14
WaitForPendingFinalizersne donne pas nécessairement de «meilleures performances»: il se bloque simplement jusqu'à ce que tous les objets de la file d'attente de finalisation aient été finalisés (objets qui auraient pu y être placés par votre appel précédent à Collect). Si vous voulez que ces objets soient collectés, vous avez besoin d' un autre appel Collect après l' appel WaitForPendingFinalizers.
LukeH

2
Étant donné que l'une des rares bonnes raisons d'appeler gc.Collect est un effort ultime pour libérer des ressources qui n'ont pas été correctement éliminées, WaitForPendingFinalizers semble une étape nécessaire. Je ne sais pas quelle serait la meilleure pratique pour éviter d'appeler excessivement gc.Collect dans de tels cas, cependant. BTW, je me demande s'il y a une raison technique pour laquelle gc.Collect «a» à promouvoir les générations? Il semblerait plus utile que les générations restent en place à moins que suffisamment de ressources n'aient été allouées en une seule pour justifier son avancement.
supercat

2
Remarque pour les débutants en C # (comme moi): l'appel de force GC ne garantit pas, certains objets concrets inutilisés seront supprimés de la mémoire. (une façon de le faire consiste à utiliser "using statement" ( msdn.microsoft.com/ru-ru/library/yh598w02(v=vs.80).aspx ))
user1234567

Pourquoi est-il censé être important d'appeler WaitForPendingFinalizers?
Christian

19
GC.Collect() 

de MDSN ,

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

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



12

GC.Collect();

Gardez à l'esprit, cependant, que le garbage collector peut ne pas toujours nettoyer ce que vous attendez ...


5
Que veux-tu dire par là? Que pourrait-il nettoyer de manière inattendue?
Voldemort

5
@Voldemort - Cela ne nettoierait rien de manière inattendue. Mais il peut ne pas nettoyer tout ce que vous attendez.
Justin Niessner

6

Vous ne souhaitez pas forcer l'exécution du garbage collector.

Cependant, si jamais vous l'avez fait (à titre d'exercice purement académique, bien sûr):

GC.Collect()

4
Je préfère la réponse de @ Karthik, il peut y avoir des situations où une application devrait légitimement appeler GC.Collect (). Très rarement cependant.
Henk Holterman

2
Supposons que vous disposiez d'un tableau de références faibles et que vous vouliez vérifier s'il existait des références «en direct». Il serait logique d'appeler GC.Collect () avant de vérifier. Juste dire.
Rich Ehmer

1
Évalué parce que la déclaration d'ouverture est factuellement incorrecte; Oui, je souhaite forcer l'exécution du ramasse-miettes.
Syndog

5

Je pense que .Net Framework fait cela automatiquement mais juste au cas où. Tout d'abord, assurez-vous de sélectionner ce que vous souhaitez effacer, puis appelez le garbage collector:

randomClass object1 = new randomClass
...
...
// Give a null value to the code you want to delete
object1 = null;
// Then call the garbage collector to erase what you gave the null value
GC.Collect();

Je pense que c'est tout. J'espère aider quelqu'un.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.