Comment détecter une fuite de mémoire?

J’ai un grand site Web qui semble absorber toute la mémoire allouée. Il n’y a rien d’autre sur le serveur à côté de ce site. En une semaine, il ronge les 2 concerts et nécessite un redémarrage. Actuellement, il s’agit du serveur 2008 32 bits utilisant IIS 7. Nous procédons à une réinstallation pour utiliser 64 bits et append de la mémoire. Ce serait bien de pouvoir localiser les fuites.

Quelle est donc la meilleure pratique pour suivre les memory leaks?

Exécutez un profileur sur votre code.

Voici deux bonnes options:

Profileur de mémoire de RedGate

JetTraines dotTrace

Je crois que les deux produits ont un essai gratuit.

Les pertes de mémoire dans .NET ne sont pas courantes, mais lorsqu’elles se produisent, elles sont généralement dues à des gestionnaires d’événements non attachés. Assurez-vous de détacher les gestionnaires avant que les auditeurs ne sortent du cadre.

Une autre option est si vous oubliez d’appeler Dispose() sur les ressources IDisposable . Cela peut empêcher le nettoyage des ressources non gérées (qui ne sont pas gérées par le GC).

Et une autre raison possible est un finaliseur dans l’impasse. Cela empêchera la collecte de tous les objects restants de la queue du finaliseur.

J’utilise WinDbg + Sos pour localiser les fuites. Les étapes sont les suivantes

  • Dump le tas et rechercher des suspects
  • Utilisez !gcroot pour savoir ce qui maintient les suspects en vie
  • Répéter au besoin

Sachez que l’utilisation importante de la mémoire peut également être due à la fragmentation de tas. Les tas normaux sont compactés, mais les objects épinglés peuvent provoquer une fragmentation. De plus, le LOH n’est pas compacté, ce qui fait que la fragmentation n’est pas rare pour LOH.

Excellents tutoriels sur WinDbg + sos ici: http://blogs.msdn.com/tess/

Courez, ne marchez pas, rendez-vous sur le blog de Tess Ferrandez. S’il est cassé, corrigez-le correctement. Des laboratoires bien scriptés lui permettent d’apprendre à diagnostiquer et à résoudre les problèmes de collisions, de blocage et de mémoire avec le code .NET. Elle possède certains des meilleurs matériaux que j’ai trouvés à ce jour pour vous aider à démarrer.

Les profileurs de mémoire commerciaux tels que ANTS et SciTech sont d’excellentes ressources pour montrer quels objects se trouvent dans le tas et comment ils sont enracinés. La plupart des profileurs de mémoire commerciaux ont la possibilité de charger un processus instantané (par exemple à partir de votre environnement de production).

Vous pouvez capturer une “capture” de mémoire (voir Snap v. Dump ) à l’aide de adplus.vbs ou de DebugDiag . Adplus est disponible dans les outils de débogage pour Windows . DebugDiag aura également une parsing rudimentaire (mais semble être plus fiable sur le code non managé) automatiquement.

Surveiller l’application
Pour une idée de ce qu’il faut surveiller, voir Amélioration des performances et de l’évolutivité .NET , plus précisément au chapitre 15.

Pour ce qui est de la surveillance, il existe également des outils commerciaux, mais chaque ordinateur Windows est également livré avec Perfmon.exe, qui peut être utilisé pour enregistrer des compteurs de performances pertinents.

Tester l’application
Pour une idée sur la façon de réaliser des tests de charge, ou de contrainte, consultez le Guide de test des performances de Patterns and Practices pour les applications Web .

Déboguer l’application
Une fois que vous avez identifié votre problème (surveillance) et que vous êtes capable de le reproduire (test), vous pouvez commencer à le déboguer. Voir les liens pour Tess – cette information vous mènera loin.

Puis rincez et répétez! 🙂

Bonne chance!
Z

Dans l’Analyseur de performances, ajoutez des compteurs pour Process / Private Octets et .NET CLR Memory / # octets dans tous les segments. Les octets privés représentent toute la mémoire et la mémoire CLR est simplement gérée. Par conséquent, si la mémoire CLR rest assez homogène mais que le nombre d’octets privés continue de croître au fil du temps, cela signifie que la fuite se trouve dans une ressource non gérée. Cela signifie généralement que vous ne supprimez pas correctement les ressources natives. Une bonne chose à regarder est des choses comme COM ou IO (stream et fichiers). Assurez-vous que tous ces éléments sont disposés lorsque vous avez terminé.

Vous pouvez essayer d’utiliser des profileurs tels que dotTrace – définissez-le dans une trace de mémoire et exécutez votre application.

Cela devrait vous donner des indices sur les assemblages et les zones de l’application qui consumnt trop de mémoire en cours de route.

Il s’agit probablement de prévention plutôt que de détection, mais au niveau du code c #, vous devez vérifier que les classes qui utilisent des ressources importantes, telles que des images et d’autres fichiers, implémentent correctement le modèle dispose . Si nécessaire, vous pouvez également avoir besoin de remplacer le finaliseur.

MSDN a de bons conseils à ce sujet.

Si vous savez que certaines classes de votre application utilisent des ressources volumineuses, ce sont les premiers endroits où rechercher des problèmes de mémoire.

J’ai trouvé que le profileur EQATEC est très bon et en plus, il est gratuit!

Consultez les laboratoires sur la mémoire et les memory leaks sur ce blog:

Démos de débogage .NET

Ils peuvent être utiles. En gros, vous pouvez utiliser WinDBG pour parsingr un vidage de mémoire et vous aider à déterminer ce qui ronge toute votre mémoire.

Nous avons utilisé une approche similaire pour déterminer que Regex nous extirpait toute notre mémoire, mais uniquement lorsque le produit était exécuté sur des ordinateurs 64 bits. La courbe d’apprentissage est assez raide, mais WinDBG est un outil très puissant.

Ce nouvel article peut être utile: Comment détecter et éviter les memory leaks et de ressources dans les applications .NET

Faites-vous une interop Office? Si tel est le cas, assurez-vous de nettoyer vos objects d’application. C’est un coupable possible.

Un autre est les objects globaux, tels que tout ce qui est statique.

Avez-vous beaucoup de pages dynamics sur votre site?

Vous pouvez également essayer Purify d’IBM

Je vous suggère d’essayer avec un petit ensemble de pages dynamics en désactivant toutes les autres pour le moment. Je n’aime pas dire cela, mais il est fort possible qu’IIS 7 présente également des fuites.

Consultez cet article sur la détection des memory leaks dans les applications .NET et les articles connexes mentionnés au bas de la page. Nous espérons que vous trouverez une solution ou du moins une idée pour la résoudre.

Merci