2013-08-17 2 views
1

Je sais que cet article peut semble faire double emploi, mais je l'ai lu tous ces articles et de développer un échantillon pour tester le thèmecomment trouver la taille de l'objet en mémoire?

Find size of object instance in bytes in c# http://www.codeproject.com/Questions/177604/Size-of-a-class-in-c How to get object size in memory? Getting the size of a field in bytes with C# http://blogs.msdn.com/b/cbrumme/archive/2003/04/15/51326.aspx

j'ai une classe voile blanc des propriétés ou des champs, il est vide juste pour tester la taille de celui-ci.

[Serializable] 
public class MemberStateModel 
{ 


} 

créer un objet et obtenir la taille de celui-ci par des codes ci-dessous:

static void Main(string[] args) 
    { 
     MemberStateModel o = new MemberStateModel() {}; 
     long size; 

     using (Stream s = new MemoryStream()) 
     { 
      BinaryFormatter formatter = new BinaryFormatter(); 
      formatter.Serialize(s, o); 
      size = s.Length; 
     } 
    } 

maintenant en taille, il indique le nombre 159, par que les postes je pense que cela signifie ma taille o est 159kbyte mais i pense que c'est pas correct et qu'un objet vide ne peut pas avoir cette taille, est-ce vrai?

il est très important pour moi parce que je stocke les données de certains utilisateurs en session et si cette taille grandit par les utilisateurs ajoutés dans mon site, je aurai besoin physiquement plus de mémoire pour gérer mon application Web

+2

Je ne pense pas que vous pouvez trouver la taille exacte d'un objet en utilisant la réflexion, la sérialisation ou toute autre approche basée sur le code. Je pense que votre option la plus simple est d'utiliser un Memory Profiler ou d'utiliser [Windbg] (http://www.windbg.org/) et sos.dll, vider le tas et vérifier la taille de l'objet là. Un avantage de l'utilisation des profileurs de mémoire ou du débogueur est également que vous pouvez vérifier votre code de production réel dans son environnement cible. – PHeiberg

+0

@ PHeiberg, je pense que vous avez raison et je vais aller le tester maintenant – motevalizadeh

Répondre

1

Le BinaryFormatter vous indique le nombre d'octets dont il a besoin pour sérialiser la classe en binaire. C'est très différent de la taille qu'une classe prend en mémoire. Par exemple, le BinaryFormatter écrit des informations sur le type dans le flux.

La taille utilisée par un objet en mémoire n'est pas définie au moment de la compilation mais au moment de l'exécution, puisque le compilateur JIT décide de la mise en page finale. Maintenant vient la question comment savoir la taille. Alors que j'ai une solution pour les structures (créer un tableau, faire de l'arithmétique du pointeur), je ne suis pas sûr de savoir comment le trouver pour les classes. Une solution serait de définir votre classe MemberStateModel comme une structure, de la mesurer, puis de revenir à une classe, en supposant qu'elle aura la même taille.

Vous pouvez également estimer la taille en comptant la taille des champs en tant que limite inférieure (car le remplissage se produit). Si votre classe a des références à d'autres instances de classe, il devient alors presque impossible d'estimer.

0

Tout d'abord, il est pas 159 kilo-octets, mais 159 octets. La raison pour laquelle même un objet vide prend de la place est que BinaryFormatter stocke aussi des méta-données avec lui. Cet article fournit une explication: http://www.codeproject.com/Articles/311944/BinaryFormatter-or-Manual-serializing.

Pour estimer la complexité mémoire de votre solution, vous pouvez utiliser un profileur de mémoire. Par exemple, j'ai utilisé celui-ci, et même une version d'essai est utile: http://www.jetbrains.com/profiler/.

Questions connexes