120 votes

Les meilleures Pratiques pour Forcer la Collecte des Ordures en C#

Dans mon expérience, il semble que la plupart des gens vous diront qu'il est peu judicieux de forcer un garbage collection, mais dans certains cas, lorsque vous travaillez avec des objets volumineux qui ne sont pas toujours collectées dans l'0 génération mais là où la mémoire est une question, est-il ok pour forcer les recueillir? Quelle est la meilleure pratique pour le faire?

116voto

Mark Ingram Points 24995

La meilleure pratique est de ne pas forcer un garbage collection.

Selon MSDN:

"Il est possible de forcer des ordures collection en appelant la Recueillir, mais la plupart du temps, cela devrait être à éviter car il peut créer des problèmes de performances. "

Toutefois, si vous pouvez fiable de tester votre code pour confirmer que l'appel à frais virés() ne devraient pas avoir un impact négatif puis aller de l'avant...

Juste essayer de vous assurer que les objets sont nettoyés lorsque vous n'en avez plus besoin. Si vous avez des objets personnalisés, regardez à l'aide de la "aide de l'instruction" et l'interface IDisposable.

Ce lien a quelques bons conseils pratiques en ce qui concerne libérer de la mémoire / la collecte des ordures, etc:

http://msdn.microsoft.com/en-us/library/66x5fx1b.aspx

36voto

Maxam Points 2682

Regardons cela de cette façon - est-il plus efficace de jeter les ordures de cuisine lorsque la poubelle est à 10%, ou laissez-le remplir avant de le sortir?

En ne le laissant pas se remplir, vous perdez votre temps à la marche et de la poubelle à l'extérieur. Cet analogue à ce qui se passe lorsque le GC thread s'exécute - tous les threads gérés sont suspendus alors qu'il est en cours d'exécution. Et Si je ne me trompe pas, le GC thread peut être partagée entre plusieurs domaines d'application, de sorte que la collecte des ordures affecte tous.

Bien sûr, vous pouvez rencontrer une situation où vous ne serez pas en ajoutant quelque chose à la poubelle sitôt à - dire, si vous allez prendre des vacances. Ensuite, il serait une bonne idée de jeter la poubelle avant de sortir.

Cela POURRAIT être une fois que le forçage d'un GC peut vous aider - si votre programme tourne au ralenti, d'utiliser la mémoire n'est pas de garbage collector, car il n'y a pas d'allocations.

35voto

Ian Ringrose Points 19115

La meilleure pratique est de ne pas forcer une collecte des ordures dans la plupart des cas. (Chaque système, j'ai travaillé sur de qui avait forcé la collecte des poubelles, avait en soulignant les problèmes qui, si elle est résolue aurait supprimé le besoin de forcé la collecte des ordures, et accéléré le système grandement.)

Il y a quelques cas, lorsque vous en savoir plus sur l'utilisation de la mémoire alors que le garbage collector. C'est peu probable dans un multi-utilisateur de l'application ou un service qui répond à plus d'une demande à la fois.

Toutefois, dans certains de lot type de traitement que vous en connaissez plus que le GC. E. g. imaginez une application.

  • Est donné une liste de noms de fichier sur la ligne de commande
  • Processus un seul fichier puis envoyer le résultat vers un fichier de résultats.
  • Pendant le traitement du fichier, crée beaucoup de l'interdépendance des objets qui ne peuvent pas être collectées jusqu'à ce que le traitement du dossier complet (par exemple, un arbre d'analyse)
  • Ne gardez pas de correspondance entre les fichiers qu'il a traitées.

Vous pouvez être en mesure de faire une affaire (après mûre) les tests que vous devez forcer un plein de collecte des ordures après avoir traiter chaque fichier.

Un autre cas est un service qui se réveille toutes les quelques minutes pour traiter de certains éléments, et de ne pas garder en l'état pendant qu'il est endormi. Alors forcement une collection complète juste avant d'aller dormir peut être utile.

Le seul moment où je considère forcer une collection, c'est quand je sais que beaucoup de l'objet a été créé récemment et très peu d'objets sont actuellement référencé.

Je préférerais avoir un garbage collection API quand j'ai pu lui donner des conseils sur ce type de chose, sans avoir à forcer un GC mon auto.

Voir aussi "Rico Mariani Performances de Tidbits"

22voto

denis phillips Points 7349

Je pense que l'exemple donné par Rico Mariani était bon: il peut être approprié pour déclencher un GC si il y a un changement significatif dans la demande de l'état. Par exemple, dans un document de l'éditeur, il peut être OK pour déclencher un GC lorsqu'un document est fermé.

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