Quand le ramasse-miettes .net s'exécute-t-il?
Quand je debug .net code, comment je peux savoir quand le garbage collector s'exécute?
Je ne veux pas de contrôle lorsque le garbage collector s'exécute. Je souhaite seulement être en mesure de savoir quand il est en cours d'exécution. J'ai un code qui est à court de ressources. Je sais que les ressources ne sont pas utilisées; je veux savoir quand le GC est en cours d'exécution pour les libérer.
Oh, et les ressources que j'ai à l'esprit sont les connexions à partir d'un pool de connexion Sql, pas de mémoire 🙂
source d'informationauteur Daniel Allen Langdon
Vous devez vous connecter pour publier un commentaire.
Vous avez à utiliser .NET 4.0, ce que vous demandez n'est pas pris en charge dans les versions plus tôt.
Essentiellement, vous appelez la WaitForFullGCApproach et la WaitForFullGCComplete méthodes dans une boucle. WaitForFullGCApproach bloquera jusqu'à ce que vous voyez un GC, WaitForFullGCComplete bloquera jusqu'à ce que le GC est terminée.
Veuillez lire attentivement cet article. Si vous utilisez cette méthode, vous êtes responsable de makign assurer la collecte des ordures se produit réellement. Si vous vous trompez ce rythme, vous risquez de casser l'GC et rapidement à court de mémoire.
http://msdn.microsoft.com/en-us/library/cc713687.aspx
Vous ne devrait pas, en général, jamais de soucis ou de penser quand le GC s'exécute.
Le Garbage collector exécuter en tant que de besoin, à une période indéterminée, à temps choisi par le runtime.
Si vous voulez plus fine de contrôle sur la GC (que je ne recommande pas, sauf dans des circonstances très particulières), vous pouvez utiliser GC.AddMemoryPressure et GC.RemoveMemoryPressure. Ce ne seront pas de la force de la GC à exécuter, mais plutôt allusion à ce qu'il y a de la mémoire d'autres dans le jeu autre que le CLR-alloué, géré la mémoire. Cela pourrait entraîner à courir de plus en plus fréquemment, ce qui peut être utile si vous êtes l'allocation de grands blocs de mémoire dans le code natif.
Il n'y a pas directement de l'API pour suivre GC s'exécute. (Par exemple, la classe GC ne contient pas tous les événements de la notification de la collecte des ordures se produire.) Le seul moyen direct de savoir, en particulier, lorsque le GC est en cours d'exécution est d'utiliser le API de profilage.
la collecte des ordures n'est pas libre de votre mise en commun des données de connexions. les connexions sont retournés à la piscine lorsque vous fermez/débarrasser de l'objet de connexion. le pool de connexion gère elle-même quand elle doit ouvrir plus de connexions et de les fermer à nouveau basé sur la façon dont dur vous frapper votre piscine et de votre configuration de la piscine dans la chaîne de connexion. la collecte des ordures n'est pas lié de quelque manière que ce soit autre que la reconquête de la mémoire allouée à des instances de SqlConnection. vous êtes aboiements le mauvais arbre en posant des questions sur la collecte des ordures et arriver (et accepté) des réponses qui n'ont rien à voir avec ce que vous êtes après (si j'ai bien compris votre question correctement).
Chaque fois qu'il se sent comme il
L' .NET garbage collector est un générationnel garbage collector. Il y a certainement une méthode à la folie, mais ce n'est pas exactement quelque chose que vous pouvez prédire avec précision.
.NET framework, GarbageCollector fonctionne vous.
En toute sincérité, .Net est mis en place pour optimiser GC. Il peut se produire à la fin d'un appel de méthode, ou il peut s'exécuter pendant une journée sans avoir à les GC. Est-il une raison spécifique que vous devez savoir quand il est recueilli?
Deux des principales raisons pour GC à terme sont: a) si la génération 0 est plein b) lorsque le segment est plein. courtoisie - CLR Via C#, Jeffrey Richter