58 votes

pour qu'elle soit adaptée à la taille de l'objet

J'essaie de savoir combien de mémoire mes objets utilisent pour voir combien d'entre eux se retrouvent sur le tas d'objets volumineux (plus de 85 000 octets).

Est-ce aussi simple que d'ajouter 4 pour un entier, 8 pour un long, 4 (ou 8 si vous êtes sur 64 bits) pour tous les types de référence, etc. pour chaque objet, ou existe-t-il des frais généraux pour les méthodes, les propriétés, etc.

54voto

Jon Skeet Points 692016

N'oubliez pas que la taille d'un objet réel ne comprend pas la taille de tous les objets qu'il référence.

Les seules choses qui sont susceptibles de se retrouver sur le tas d'objets volumineux sont des tableaux et chaînes de caractères - autres objets ont tendance à être relativement petits en eux-mêmes. Même un objet avec (par exemple) 10 référence des variables de type (4 octets sur x86) et 10 Guid (16 octets chacun) est seulement d'environ 208 octets (il y a un peu de surcharge pour le type de référence et de synchronisation de bloc).

De même, lorsque vous pensez à la taille d'un tableau, n'oubliez pas que si le type d'élément est un type de référence, alors c'est seulement la taille de l' références qui comptent pour l'ensemble lui-même. En d'autres termes, même si vous avez un tableau avec 20 000 éléments, la taille de la matrice de l'objet lui-même sera seulement un peu plus de 80K (sur x86), même si elle fait référence à un beaucoup plus de données.

37voto

Gomes Points 419

Veuillez suivre ces étapes pour obtenir la taille de l'objet.

1) aller à Visual Studio(2010) Propriétés du Projet - > onglet Debug -> Activer le débogage de code non managé.

2) aller à Visual Studio Debug menu -> Options et Paramètres -> Débogage -> Symboles.

3) Il y a activer Microsoft Serveur de Symbole,laissez la valeur par défaut.(les symboles peuvent commencer à télécharger)

4) Définir le point d'arrêt dans votre code, démarrer le débogage(F5).

5) Ouvrir Debug -> Windows -> Fenêtre Immédiate.

6) entrez .charge sos.dll(Fils de Grève)

7) entrez !DumpHeap de type Maclasse (l'objet que vous voulez trouver la taille)

8) de les mettre à localiser l'adresse de l'objet c'est à dire(00a8197c)

Adresse MT Taille 00a8197c 00955124 36

9) Ensuite, à l' !ObjSize 00a8197c

10) Là vous allez -> sizeof(00a8197c) = 12 (0x48) octets (Maclasse)

11voto

serhio Points 9649

Si vous le pouvez - Sérialisez-le!

 Dim myObjectSize As Long

Dim ms As New IO.MemoryStream
Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
bf.Serialize(ms, myObject)
myObjectSize = ms.Position
 

9voto

David Pokluda Points 4284

Que vous obtenez dans un domaine de pointe .NET de débogage. Commencez avec John Robins débogage livres.

Utilisation WinDBG avec Sos.dll (une partie de .La distribution de moustiquaires) et Sosex.dll extensions. Avec ces outils, vous pouvez vraiment voir ce qui se passe lorsque votre application est en cours d'exécution. Vous trouverez des réponses à vos questions indiquées plus haut.

(Une autre recommandation serait d'installer la Source Partagée de la CLI 2.0, aka. Rotor 2, pour voir ce qui se passe sous le capot.)

5voto

IvanH Points 2465

Gomes méthode simplifiée:

  1. aller à Visual Studio(2010) Propriétés du Projet - > onglet Debug -> Activer le débogage de code non managé.

  2. Définir le point d'arrêt dans votre code, démarrer le débogage(F5).

  3. Ouvrir Debug -> Windows -> Fenêtre Immédiate.

  4. saisissez .charge sos

  5. entrée (remplacer myObject avec le nom de votre objet)

? String.Format("{0:x}",Integer.Parse(System.Runtime.InteropServices.GCHandle.InternalAddrOfPinnedObject(System.Runtime.InteropServices.GCHandle.Alloc(monobjet).GetHandleValue()).ToString()) - 4)

6. Utiliser le résultat comme paramètre de la !ObjSize

voir: SOS.DLL objet, l'Adresse et le débogueur Visual Studio Introduction

Exemple (nous sommes à la recherche pour objet nommé tbl):

.load sos
extension C:\Windows\Microsoft.NET\Framework\v4.0.30319\sos.dll loaded
? string.Format("{0:x}",Integer.Parse(System.Runtime.InteropServices.GCHandle.InternalAddrOfPinnedObject(System.Runtime.InteropServices.GCHandle.Alloc(tbl).GetHandleValue()).ToString())-4)
"27ccb18"
!ObjSize 27ccb18
PDB symbol for clr.dll not loaded
sizeof(027ccb18) =       154504 (     0x25b88) bytes (System.Data.DataTable)

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