2010-10-05 5 views
0

Donc si vous voulez regarder le bloc de synchronisation pour un objet, sous sos vous devez regarder -4 octets (sur les machines 32 bits) avant l'adresse de l'objet. Est-ce que quelqu'un sait quelle est la sagesse pour revenir 4 octets? Je veux dire qu'ils pourraient avoir un bloc de synchronisation à 0, puis tapez handle à +4 et ensuite des champs d'objet à +8.Pourquoi syncblk est situé à -4 et pas à 0?

+0

Je vois, Comme vous pouvez le voir, je suis trop nouveau sur ce forum. J'ai marqué certains d'entre eux comme des réponses maintenant (heureusement sans aucune erreur). Merci de l'avoir signalé Cerveau, très apprécié – imak

+0

de rien. –

Répondre

1

Ceci est un détail d'implémentation, donc je ne peux pas vous donner la raison exacte du placement du syncblock. Cependant, si vous regardez la CLI de la source partagée, vous verrez que le moteur d'exécution dispose de toutes sortes d'optimisations sur la manière dont les objets sont alloués et utilisés, et en fait les données associées à une seule instance se trouvent à plusieurs endroits différents. Le syncblock par exemple est juste une valeur d'index pour une structure située ailleurs. De même, le MethodTable et l'EEClass sont stockés ailleurs. Ce sont tous les détails de mise en œuvre. Le point important de l'OMI est de comprendre comment extraire les informations nécessaires lors du débogage. Il est beaucoup moins important de comprendre pourquoi les détails de mise en œuvre sont tels qu'ils sont.

+0

@Brain, je comprends que c'est le détail de la mise en œuvre, mais je sais aussi que la performance est quelque chose de très proche et cher aux coeurs de l'équipe GC. Je suis juste curieux de savoir pourquoi ce design a été choisi par rapport à avoir syncBlock à partir de 0. – imak

0

Je dirais qu'il correspond aux attentes, en particulier pour les structures qui ont été explicitly laid out. Comme le dit Brian, ce n'est qu'un détail de mise en œuvre. Il est similaire au nombre d'implémentations de malloc allouant plus d'espace que demandé, stocker la taille d'allocation dans les quatre premiers (ou huit) octets, puis renvoyer un pointeur décalé pour pointer vers l'octet suivant.

Questions connexes