2012-08-02 1 views
2

Dire que j'ai classe suivante:Comprendre Large Object Heap et statistiques de sortie par dumpheap

Class A 
{ 
B b; 
C c; 
D d; 
} 

D'abord, j'allouer:

var b1 = new B(); 
var c1 = new C(); 
var d1 = new D(); 

chacun b1, c1, d1 est inférieur à 85K, donc ils sont attribués sur le petit tas d'objets. Alors je:

var a1 = new A { b = b1, c = c1, d = d1 }; 

Question1: Quand je fais !DumpHeap -stat ne l'utilisation de mem de A comprennent la mémoire occupée par ses variables membres? Sinon, qu'est-ce que cela inclut réellement?
EDIT: trouvé la réponse à cette question dans cet article: http://blogs.msdn.com/b/tess/archive/2005/11/25/dumpheap-stat-explained-debugging-net-leaks.aspx. Il est logique que l'utilisation mem de A n'inclut pas la mémoire occupée par b1, c1, d1. Il inclut la mémoire nécessaire pour stocker les références b1, c1, d1 elles-mêmes.

Question2: Est-ce que a1 est allouée sur le tas d'objets volumineux (en supposant la taille de b1 + c1 + d1> 85K)? Pourquoi? Les références b1, c1, d1 pointent vers des objets sur un petit tas d'objets. Alors pourquoi a1 s'asseoir sur le LOH?

Question3: Permet de le retourner. Say taille de b1 est plus de 85K, donc son alloué sur le LOH. Mais pour stocker des références à b1, c1, d1 nous avons seulement besoin de quelques octets. Ai-je raison de croire que a1 sera allouée sur le petit tas d'objets?

Répondre

1

1) Comme vous l'avez déjà constaté, la taille de l'instance de A n'inclut pas la taille des objets référencés. Toutefois, si vous souhaitez connaître la taille, utilisez la commande !objsize. Gardez à l'esprit que si plusieurs objets font référence aux mêmes objets, la taille de ceux-ci sera incluse plusieurs fois.

2) L'objet référencé par a1 n'est pas alloué sur le LOH. L'objet lui-même est inférieur à 85000 octets, il est donc alloué sur le tas normal. Utilisez la commande !gcwhere pour afficher la partie du tas dans laquelle se trouve un objet donné.

3) Peu importe si la référence b1 pointe vers un objet volumineux. La taille de n'importe quelle instance de A sera seulement trois références plus un surcoût supplémentaire (une référence à l'objet type et un syncblock). C'est à dire. la taille sera très éloignée de la limite LOH.