2010-07-12 6 views
2

J'essaie de réparer un ancien système obsolète et compliqué avec une fuite de mémoire. J'ai retracé le problème et la meilleure façon de décrire la fuite de mémoire est que c'est "par conception". En termes simples, il y a un observateur d'événement qui détient une référence aux objets après qu'ils ont été abandonnés. Pour cette raison, les objets ne peuvent pas être collectés par le garbage collector et restent indéfiniment en mémoire.System.OutOfMemoryException

Existe-t-il un moyen d'obtenir une collection d'objets qui contiennent actuellement une référence à une instance?

Répondre

1

Vous pouvez essayer d'obtenir des connaissances techniques en utilisant WinDbg avec la DLL d'extension Sosex. Si vous n'êtes pas familier avec WinDbg alors essayez de lire blog de Tess Ferrandez qui est une mine d'or de l'information de débogage .NET.

Fondamentalement, Sosex.dll a une commande !Refs qui liste les objets qui ont une référence à une adresse d'objet spécifique que vous donnez. Par exemple:

Usage: 
!refs <hexObjectAddr> 

Lists all references held by the specified object 
Lists all references to the specified object (searches heaps, stacks, registers, handle tables and the freachable queue) 

Refs are listed in the following format: 
hexAddr decSize strTypeName 

Sample output: 
0:000> !sosex.refs 7fff2970 
Objects referenced by 7fff2970: 
7fff1100   64 System.IO.__ConsoleStream 
7fff1388  136 System.Text.SBCSCodePageEncoding 
7fff2c50   48 System.Text.DecoderNLS 
7fff2c80  280 System.Byte[] 
7fff2d98  536 System.Char[] 
7fff1140   24 System.Byte[] 

Objects referencing 7fff2970: 
7fff2fb0   32 System.IO.TextReader+SyncTextReader 
`` 

S'il vous plaît noter que ceci est une solution très hardcore, ce qui nécessitera un peu juste de la préparation si vous; re nouveau à ce sujet. Cependant, cela peut être un moyen très puissant de déboguer des applications .NET.

3

Je ne connais pas cette façon.
Mais - Collection de références faibles pourrait être utile dans de telles situations.
Regardez here

3

Non, sauf si vous utilisez l'API du débogueur.

Une option pour ce genre de chose est la classe WeakReference. Si vous recherchez WeakReference avec des événements, vous trouverez beaucoup de documents avec des suggestions pour savoir comment faire face exactement à ce problème. Aucun d'eux n'est particulièrement propre, d'après ce dont je me souviens, mais ils devraient fonctionner raisonnablement bien.

A titre d'exemple, this page discute d'un certain nombre d'approches différentes.

Questions connexes