Comment détecter où se trouve une fuite de mémoire?
J'ai un grand site web qui semble être l'aspiration de la mémoire allouée. Il n'y a rien d'autre sur le serveur à côté de ce site. Dans une semaine, il ronge les 2 concerts et nécessite un redémarrage. Actuellement, c'est server 2008 32 bits à l'aide de IIS 7. Nous sommes à la réinstallation à utiliser 64 bits et d'ajouter plus de mémoire. Il serait agréable d'être en mesure de traquer où les fuites se produisent.
Alors, quelle est la meilleure pratique pour le suivi des fuites de mémoire?
source d'informationauteur Boone
Vous devez vous connecter pour publier un commentaire.
Exécuter un profiler sur votre code.
Ici sont deux bonnes options:
RedGate du profileur de mémoire
Jetbrains dotTrace
Je crois que les deux produits ont une version d'essai gratuite.
Des fuites de mémoire .NET ne sont pas nombreux, mais quand ça arrive, c'est le plus souvent due aux seules des gestionnaires d'événements. Assurez-vous de détacher les gestionnaires, avant les auditeurs à aller hors de portée.
Une autre option si vous oubliez de l'appel
Dispose()
surIDisposable
ressources. Cela peut empêcher le nettoyage de ressources non managées (qui ne sont pas gérés par le GC).Et encore une autre raison possible est une impasse du finalizer. Qui permettra d'éviter tous les objets restants dans le finaliseur file d'attente d'être collectés.
- Je utiliser WinDbg + Sos pour traquer les fuites. Les étapes sont comme suit
!gcroot
pour savoir ce qui est de maintenir les suspects vivantÊtre conscient que la grande utilisation de la mémoire peut aussi être due à la fragmentation du segment. Le régulier tas sont compactés, mais épinglé objets peuvent provoquer la fragmentation. Aussi, la liturgie des heures n'est pas compactée afin de fragmentation n'est pas rare pour les LOH.
Excellents tutoriels sur WinDbg + sos ici: http://blogs.msdn.com/tess/
Commercial profileurs de mémoire comme Les FOURMIS et SciTech sont d'excellentes ressources qui montrera ce que les objets sont dans le tas, et la façon dont ils sont enracinés. La plupart des commerciaux profileurs de mémoire ont la possibilité de charger une mémoire 'snap' d'un processus (disons à partir de votre environnement de production).
Vous pouvez capturer une mémoire "snap" (voir Composant logiciel enfichable v. Dump) à l'aide de adplus.vbs ou DebugDiag. Adplus est disponible en tant que partie de la Les Outils de débogage pour Windows. DebugDiag aurez aussi rudimentaire de l'analyse (mais semble être le plus fiable sur le code non managé) auto-magiquement.
Surveiller l'Application
Pour avoir une idée sur ce qu'il faut surveiller, voir L'amélioration de .NET les Performances et l'Évolutivité, plus précisément le Chapitre 15.
Quant à la façon de surveiller, il y a des outils pour ça, cependant, toutes les versions Windows de la machine est également livré avec Perfmon.exe qui peut être utilisé pour enregistrer pertinentes compteurs de performance.
Tester l'Application
Pour avoir une idée sur la façon d'effectuer de la charge, ou de stress, tests, découvrez les Modèles et les Pratiques Des Tests de Performance d'Orientation pour les Applications Web.
Déboguer l'Application
Une fois que vous avez identifié vous avez un problème (de surveillance) et de votre pouvoir reproduire le problème (test de), vous pouvez descendre à déboguer le problème. Voir les liens pour Tess - que l'information va vous porter un long chemin.
Puis rincez et répétez! 🙂
Bonne chance!
Z
Dans l'analyseur de performances, ajouter des compteurs de Processus/d'Octets Privés et .NET CLR Mémoire/nombre d'Octets dans Tous les Segments. Octets privés est toute la mémoire et la CLR de la mémoire est réussi. Donc, si le CLR mémoire reste assez même, mais les octets privés continue de croître au fil du temps, cela signifie que la fuite est dans des ressources non managées. Cela signifie généralement que vous n'êtes pas disposer de ressources autochtones correctement. Une bonne chose à regarder est des trucs comme COM ou IO (flux et fichiers). Assurez-vous que tout ce genre de choses se disposés lorsque vous avez fini avec elle.
Vous pouvez essayer d'utiliser des profileurs comme dotTrace -- le mettre en mémoire, de la trace et de l'exécution de votre application.
Cela devrait vous donner des indices qui les assemblées et les zones de l'application qui mangent trop de mémoire sur l'aller.
C'est probablement la prévention plutôt que de la détection, mais dans le code c# de niveau, vous devez vérifier que toutes les classes qui utilisent des ressources importantes telles que les images et autres fichiers sont correctement la mise en œuvre de le modèle dispose. Si nécessaire, vous pouvez aussi avoir besoin de remplacer le finaliseur.
MSDN a de bons conseils sur ce sujet.
Si vous avez des classes de votre application que vous savez faire usage de ressources importantes, ce sont les premiers endroits pour rechercher des problèmes de mémoire.
J'ai trouvé que la EQATEC Profiler est assez bonne, et en plus c'est gratuit!
Découvrez la Mémoire et de la Mémoire de la Fuite des laboratoires sur ce blog:
.NET le Débogage des Démos
Ils peuvent être de quelque secours. Fondamentalement, vous pouvez utiliser WinDBG pour analyser un dump de la mémoire et aider à déterminer ce qui est de manger tous votre mémoire.
Nous avons utilisé une approche similaire pour déterminer que la Regex était à mâcher jusqu'à l'ensemble de notre mémoire, mais seulement lorsque le produit a été exécuté sur les ordinateurs 64 bits. La courbe d'apprentissage est une sorte de raide, mais WinDBG est un outil très puissant.
Ce nouvel article de la mine peut-être utile: Comment détecter et éviter les fuites de mémoire et de ressources .NET applications
Ne vous faites n'importe quel Bureau de l'interopérabilité? Si oui, assurez-vous de nettoyer vos objets de l'application. C'est un coupable possible.
Un autre est des objets globaux, comme tout ce qui est statique.
Vous avez beaucoup de pages dynamiques sur votre site?
Vous pouvez également essayer IBM Purifier
Je vous suggère d'essayer avec un petit ensemble de pages dynamiques, la désactivation de tous les autres pour l'instant. Je déteste dire cela, mais il est fort possible que IIS 7 peut également avoir des fuites.
Regarder cet article sur la détection .NET application des fuites de mémoire et articles connexes mentionnées en bas de la page et j'espère que vous trouverez une solution ou au moins une idée pour le résoudre.
Grâce