2009-10-27 19 views
11

Cada vez que se crea un objeto nuevo, el objeto se crea en el montón. La memoria asignada para cada objeto tiene dos campos adicionales 1) El puntero del objeto de tipo 2) índice de bloque de sincronización.Objetos asignados en el montón

¿Cuál es exactamente el uso de estos dos campos? ¿Alguien puede arrojar luz sobre esto?

+0

Dado que todos los objetos son de un tipo específico, howelse es el tiempo de ejecución que se supone que debe saberse a menos que registre el tipo en alguna parte ...? No te preocupes por leer ese tipo de cosas, preocúpate por tu propio código. –

+0

@mP Exactamente: ¿por qué no registra esa información para los tipos de valor? Siempre vale la pena saber cómo funcionan tus herramientas. – TarkaDaal

Respuesta

17

El puntero de tipo de objeto se utiliza para representar el tipo de objeto. Esto es necesario para:

  • método lookup (la viable)
  • comprobación arroja
  • Encontrar el objeto Type si llama GetType.

El campo syncblock se usa principalmente para el bloqueo. Solo se rellena cuando es necesario, y cuando un bloqueo siempre es indiscutible, CLR lo hace con un bloqueo "delgado" que no requiere ningún dato externo. De lo contrario, es una entrada en una tabla de todo el proceso: no conozco los detalles de lo que hay en la tabla, pero me imagino que es algo así como una lista de hilos esperando en el monitor del objeto. Por supuesto, la información más importante es si el bloqueo se mantiene o no actualmente, por qué hilo y cuál es su recuento (debido a la naturaleza reentrante de los bloqueos .NET).

El syncblock también se rellena si llama al GetHashCode() y no se reemplaza: utiliza la tabla de todo el proceso para asignar un número estable, básicamente. (La dirección del objeto no es lo suficientemente buena ya que puede cambiar con el tiempo.)

+0

No sabía eso sobre GetHashCode y el syncblock ... ¿tiene más información al respecto? Encontré este http://blogs.msdn.com/brada/archive/2003/09/30/50396.aspx pero parece ser .NET 1.0/1.1 solo ... – thecoop

+1

@thecoop: no tengo ningún otra referencia a mano, aunque espero que se mencione en CLR a través de C#. –

+0

Creo que el syncblock también se usa para almacenar metadatos de interoperabilidad COM, y un AppDomainID (como dijo @JonSkeet, es una entrada en una "_process-wide_ table.") – Sindhudweep

2

El índice de bloque de sincronización se usa debajo del capó por la clase Monitor y, por lo tanto, también la instrucción de bloqueo.

1

GC también utiliza algunos bits del índice de bloques de sincronización para marcar un objeto como basura en caso de que ya no se haga referencia a él.

Cuestiones relacionadas