2010-02-26 12 views
5

J'ai exécuté des tests de charge sur une application Web de production ASP.NET et je vois un grand nombre de System.WeakReferences créées sur le tas. Dans environ 15 minutes sous charge, la mémoire de tas a atteint environ 3 Go et j'ai environ 5 000 000 références à System.WeakReference. L'exécution d'un nettoyage forcé de toutes les générations ne libère pas ces références. J'ai vu des messages à propos de la classe auxiliaire __ENCLIST qui, si les assemblys sont compilés dans debug, peut créer des WeakReferences pour tous les objets créés, au début je pensais que c'était le problème, mais j'ai vérifié que tous les assemblys déployés sont intégrés.Qu'est-ce qui pourrait expliquer plus de 5 000 000 instances System.WeakReference sur le tas géré?

J'utilise WinDbg pour déboguer le processus, voici les quelques dernières lignes de !dumpheap -stat

 
000007fef788e0c0 39253  18510000 System.Collections.Hashtable+bucket[] 

00000000021bf120 94336 151023192  Free 

000007fef7887e98  5959 189838752 System.Char[] 

000007fef7874390 517429 589750224 System.Object[] 

000007fef78865a0 1531190 1230824112 System.String 

000007fef787dab8 51723338 1655146816 System.WeakReference 

Comme vous pouvez le voir sur les 1,5 Go de mémoire a été consommée par ces System.WeakReferences.

Est-ce que quelqu'un a une idée de ce qui pourrait créer toutes ces WeakReferences?

+0

Avez-vous essayé profiler l'application - certains profileurs vous dira quelle méthode allouée etc .. De plus, les WeakReferences doivent être tenus de faire quelque part pour un gcroot! pourrait jeter un peu de lumière. –

+2

la sécurité en chiffres? –

+0

Merci Michael, j'ai exécuter gcroot et la sortie est comme suit DOMAIN (000000000213D530): MANCHE (Épinglé): 19813f0: Racine: 000000017f4cf0e0 (System.Object []) -> 000000013f512608 (System.Collections.Generic .List'1 [[System.WeakReference, mscorlib]]) -> 000000018f932060 (System.Object []) -> 00000000ffe1b1a0 (System.WeakReference) Toutes les instances reconduisent à un Épinglé System.Object [ ], cet objet [] contient une énorme quantité d'autres données, des idées? – nickc

Répondre

4

Il s'est avéré que j'avais une fuite System.WeakReference due à la création dynamique d'instances System.Diagnostics.TraceSwitch, en interne TraceSource/TraceSwitch alloue un WeakReference au nouveau TraceSource/TraceSwitch et place le WeakReference dans une liste. Bien que WeakReference permette de récupérer le TraceSource/TraceSwitch, le WeakReference lui-même ne sera jamais libéré, ce qui entraînera une fuite de mémoire.

Un peu plus d'information peut être trouvée ici

http://msdn.microsoft.com/en-us/library/system.diagnostics.tracesource(VS.80).aspx