2009-02-17 6 views
5

Existe-t-il un moyen de déterminer la quantité de mémoire utilisée pour un objet particulier? Par exemple une liste. Prenant tout en compte, comme l'internalisation de chaîne et tout ce qui est fait par compilateur/environnement d'exécution/peu importe.C#: utilisation de la mémoire d'un objet

+0

Dupliqué: http://stackoverflow.com/questions/426396/how-much-memory-does-ac-net-object-use – FerranB

+0

Donc, il semble ... désolé 'bout à bout :) – Svish

Répondre

2

Vous devriez vraiment définir exactement ce que vous entendiez par "combien de mémoire est utilisée pour un objet particulier". Par exemple, vous pourriez vouloir dire "si cet objet était collecté, combien serait libéré" - ou vous pourriez dire "combien de mémoire cet objet et tout ce qu'il touche prennent". Votre point sur l'internage de chaîne est un bon exemple.

Supposons que vous faites:

List<string> internedStrings = new List<string>(); 
List<string> nonInternedStrings = new List<string>(); 
for (int i=0; i < 1000; i++) 
{ 
    string tmp = new string(' ', i+1); 
    nonInternedStrings.Add(tmp); 
    tmp = tmp.Intern(); 
    internedStrings.Add(tmp); 
} 

Est-nonInternedStrings vraiment prendre plus de mémoire que internedStrings? Si internedStrings était garbage collecté, il ne libérerait pas autant de mémoire - mais si internedStrings n'avait jamais été créé (y compris ne pas interner chacun de ses éléments) alors plus de mémoire n'aurait jamais été nécessaire.

Si vous pouvez être plus précis à propos de exactement ce que vous voulez dire, nous pouvons peut-être vous aider. C'est un problème complexe cependant.

+0

bien, c'est exactement ce que je voulais savoir: p Si, quand je récupère tout un tas de lignes de la base de données (où de nombreuses lignes comprennent la même chose cordes dans certaines colonnes), devrais-je m'assurer qu'ils sont internés, ou ne devrais-je pas m'en préoccuper? – Svish

+0

Je ferais la chose la plus simple qui fonctionne pour commencer, puis profiler votre application pour voir combien de mémoire elle utilise. Cependant, je n'utiliserais pas String.Intern - J'ai laissé une réponse à votre autre question pour expliquer pourquoi. –

+0

va vérifier, merci =) – Svish

1

Avez-vous essayé CLR Profiler 2.0?

+1

essayez celui-là. Espérait quelque chose dans le code cependant. Donc, je pourrais trier Console.WriteLine (MemoryUsageOf (someObject)) ou quelque chose comme ça: p – Svish

+0

CLR Profiler vous fournit une mine d'informations le long des informations de la mémoire ... La meilleure façon d'écrire du code est d'écrire aucun code;) –

+0

Si cela fonctionne ... Exécution du programme fonctionne, le lancement de mon programme fonctionne. Mais quand je quitte mon programme, le profileur CLR jette une exception: – Svish

2

Cela semble être un frère ou une soeur Delphi question. Un algorithme naïf ne prendra pas en compte la différence entre l'agrégation et la composition. Même un algorithme basé sur mark et sweep ne vous dira pas si une table de hachage doit développer son tableau interne car un objet a été référencé par elle. Il est probablement préférable de profiler votre application pour une variété de scénarios et de tracer l'utilisation des ressources par rapport à N, où N est une mesure de l'échelle de votre ensemble de données.

5

ANTS Memory Profiler définit la consommation de mémoire du code .NET. J'ai eu d'excellents résultats avec ça par le passé.

Questions connexes