55 votes

La quantité de mémoire en C#/.NET que l'utilisation des objets?

Je suis du développement d'une application qui ont actuellement des centaines d'objets créés.

Est-il possible de déterminer (ou approximative) de la mémoire allouée par un objet (instance de classe)?

40voto

Rauhotz Points 3155

Vous pouvez utiliser un memory profiler comme

.NET Memory Profiler (http://memprofiler.com/)

ou

CLR Profiler (gratuit)http://clrprofiler.codeplex.com/)

40voto

varun Points 1446

Un grossier moyen pourrait-il être présent au cas où vous voulez savoir ce qui se passe avec un objet particulier

// Measure starting point memory use
GC_MemoryStart = System.GC.GetTotalMemory(true);

// Allocate a new byte array of 20000 elements (about 20000 bytes)
MyByteArray = new byte[20000];

// Obtain measurements after creating the new byte[]
GC_MemoryEnd = System.GC.GetTotalMemory(true);

// Ensure that the Array stays in memory and doesn't get optimized away
MyByteArray[1] = 20;

processus à l'échelle choses pourraient être obtenus peut-être comme ça

long Process_MemoryStart = 0;
Process MyProcess = System.Diagnostics.Process.GetCurrentProcess();
Process_MemoryStart = MyProcess.PrivateMemorySize64;

espérons que cette aide ;)

11voto

George Stocker Points 31258

Les FOURMIS memory profiler vais vous dire exactement comment beaucoup est alloué pour chaque objet, de méthode, etc.

10voto

Runscope API Tools Points 43859

Voici un poste où nous avons discuté de la détermination de la taille des types référence.

6voto

Charles Bretana Points 59899

Chaque "classe" nécessite assez de mémoire pour contenir tous c'est jit-le code compilé pour tous les membres qui ont été appelés par le moteur d'exécution, (bien que si vous ne t appeler une méthode pour assez un certain temps, le CLR peut libérer de la mémoire et de la re-jit à nouveau si vous l'appelez à nouveau... plus assez de mémoire pour contenir toutes les variables déclarées dans la classe... mais cette mémoire est allouée qu'une seule fois par catégorie, peu importe combien d'instances de la classe que vous créez.

Pour chaque instance de la classe que vous créez, (et n'a pas été nettoyée), vous pouvez vous rapprocher de l'empreinte mémoire en ajoutant l'utilisation de la mémoire par chaque instance de base de variable déclarée... (sur le terrain)

les variables de référence (les références à d'autres objets) prendre 4 ou 8 octets (32 bits / 64 bits de l'OS ?) int16, Int32, Int64 prendre 2,4 ou 8 octets, respectivement...

chaîne de caractères de la variable de stockage supplémentaire pour certaines méta éléments de données, (plus la taille du pointeur d'adresse)

En outre, chaque variable de référence à un objet peut aussi être considéré comme "indirectement" inclure la mémoire sur le tas par l'objet, il témoigne, bien que vous auriez probablement souhaitez compter que la mémoire comme appartenant à cet objet n'est pas la variable qui fait référence...

etc. etc.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X