Compteurs Perfmon pour vérifier la fuite de mémoire
je veux vérifier le problème de fuite de mémoire dans mon service. J'ai essayé de suivre les compteurs perfmon.
- .NET CLR Mémoire# Octets dans tous les segments de mémoire
- .NET CLR MemoryGen 2 Heap Size
- .NET CLR Memory# GC handles
- .NET CLR Mémoire# de Épinglé Objets
- .NET CLR Mémoire# total d'Octets
- .NET CLR Mémoire# total d'Octets réservés
- .NET CLR MémoireTas d'Objets Volumineux taille
je l'ai mentionné ci-dessus un ensemble de ici
renvoie aussi à l'ensemble suivant:
- Mémoire/D'Octets Disponibles
- Mémoire/Octets
- Processus/Privé Octets
- Processus/Page Octets Du Fichier
- Nombre De Processus/Manipulations
je l'ai mentionné ci-dessus un ensemble de ici
paramètre/critères ou de toute autre meilleure façon de identifier le compteur perfmon pour une fuite de mémoire?
Est-ce que quelqu'un peut me suggérer un jeu de compteurs pour vérifier la fuite de mémoire? Ou au-dessus des ensembles couvre fuite de mémoire?
2 réponses
pour détecter une fuite de mémoire à L'aide D'un moniteur de Performance, surveillez ces compteurs:
- le compteur Mémoire / Octets disponibles vous permet de voir le nombre total d'octets de mémoire disponible. Cette valeur fluctue, mais si vous avez une application avec la fuite de mémoire, il va diminuer sur temps.
- le compteur D'octets mémoire/engagé augmentera de façon constante si une fuite de mémoire se produit, parce que le nombre d'octets disponibles de la mémoire diminue, le nombre de octets augmente.
- Le Processus/compteur Octets Privés affiche le nombre d'octets réservés exclusivement à un processus spécifique. Si une fuite de mémoire est cette valeur aura tendance à augmenter régulièrement.
- le compteur D'octets de processus/Page affiche la taille du fichier. Windows utilise la mémoire virtuelle (le pagefile) pour compléter un la machine de la mémoire physique. Comme la mémoire physique d'une machine commence à remplir, les pages de mémoire sont déplacées dans le fichier. Il est normal le pagefile à utiliser même sur les machines avec beaucoup de mémoire. Mais si la taille du fichier augmente régulièrement, c'est un bon signe. fuite de mémoire se produit.
- je veux aussi mentionner le compteur Process/Handle Count. Les Applications utilisent des poignées pour identifier les ressources qu'elles doivent accès. Si une fuite de mémoire se produit, une application souvent créer des poignées supplémentaires pour identifier les ressources de mémoire. Ainsi, une hausse des le nombre de handles pourrait indiquer une fuite de mémoire. Cependant, pas tous les fuites de mémoire entraînera une augmentation du nombre de handles.
D'après mon expérience, c'est exact.
je vous renvoie aussi à ce blog Microsoft Advanced Debugging de Tess, un employé de Microsoft. Qui suggère les pions suivants. J'ai trouvé que ce qui précède est plus que suffisant pour indiquer une fuite de mémoire est présent, mais je crois que les instructions de Tess pourraient fournir un aperçu plus approfondi de la question.
Débogage Démos - La Revue De Mémoire
- .NET CLR Mémoire/# Octets dans tous les segments de mémoire
- .NET CLR Mémoire/Grand Objet de la Taille du Segment
- .NET CLR Mémoire/Gen 2 taille de segment de mémoire
- .NET CLR Mémoire/Gen 1 taille de segment de mémoire
- .NET CLR Mémoire/Gen 0 taille de segment de mémoire
- Processus/Privé Octets
- Processus / Octets Virtuels
Il y a de meilleurs outils disponibles pour faciliter les tests de fuites de mémoire comme Redgate ANTS Memory Profiler et JetBrains dotMemory Profiler.
cependant si vous voulez utiliser des compteurs de Performance, cet article explique comment utiliser des compteurs de Performance pour tester les fuites de mémoire.
gardez à l'esprit que la collecte des ordures ne libère pas la mémoire immédiatement après une certaine instance disposer. Il a été optimisé pour déclencher et ne libérez la mémoire que lorsqu'il y a un stress de mémoire. Donc, si vous voulez tester pour les fuites de mémoire, vous devriez exécuter la collecte des ordures manuellement avant de prendre des lectures de compteur.
GC.Collect();
GC.WaitForPendingFinalizers();