2009-10-27 7 views
11

Chaque fois qu'un nouvel objet est créé, l'objet est créé sur le tas. La mémoire allouée à chaque objet possède deux champs supplémentaires 1) Le pointeur d'objet de type 2) l'index de bloc de synchronisation.Objets affectés au tas

Quelle est exactement l'utilisation de ces deux champs. Quelqu'un peut-il nous éclairer là-dessus?

+0

Étant donné que tous les objets sont d'un type spécifique, comment le runtime est-il supposé savoir à moins qu'il n'enregistre le type quelque part ...? Ne vous inquiétez pas de lire ce genre de choses, s'inquiéter de votre propre code. –

+0

@mP Exactement - alors pourquoi n'enregistre-t-il pas cette information pour les types de valeur? Cela vaut toujours la peine de savoir comment fonctionnent vos outils. – TarkaDaal

Répondre

17

Le pointeur d'objet de type est utilisé pour représenter le type de l'objet. Ceci est nécessaire pour:

  • Méthode recherche (le vtable)
  • Checking jette
  • Trouver l'objet Type si vous appelez GetType.

Le champ syncblock est principalement utilisé pour le verrouillage. Il n'est rempli que quand il doit l'être, et quand un verrou est toujours incontesté, le CLR se contente d'un verrou "fin" qui ne nécessite aucune donnée externe. Sinon, c'est une entrée dans une table à l'échelle du processus - je ne connais pas les détails de la table, mais j'imagine que c'est une liste de threads qui attendent sur le moniteur de l'objet. Bien sûr, le bit d'information le plus important est de savoir si le verrou est actuellement maintenu, par quel thread, et quel en est le nombre (en raison de la nature réentrante des verrous .NET).

Le syncblock est également rempli si vous appelez GetHashCode() et qu'il n'est pas remplacé - il utilise la table à l'échelle du processus pour allouer un nombre stable, fondamentalement. (L'adresse de l'objet n'est pas assez bonne car elle peut changer au fil du temps.)

+0

Je ne le savais pas sur GetHashCode et le syncblock ... avez-vous plus d'informations à ce sujet? J'ai trouvé ce http://blogs.msdn.com/brada/archive/2003/09/30/50396.aspx mais il semble que ce soit .NET 1.0/1.1 seulement ... – thecoop

+1

@thecoop: Je n'en ai pas autre référence à la main, bien que je m'attendrais à ce qu'il soit mentionné dans CLR via C#. –

+0

Je crois que le syncblock est également utilisé pour stocker les métadonnées COM interop, et un AppDomainID (comme dit @JonSkeet, c'est une entrée dans une "table _process-wide_.") – Sindhudweep

2

L'index de bloc de synchronisation est utilisé sous le capot par la classe Monitor et donc également par l'instruction lock.

1

Certains bits d'index de bloc de synchronisation sont également utilisés par le GC pour marquer un objet comme déchet s'il n'est plus référencé.

Questions connexes