Pregunta

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 tipo 2) índice de bloque de sincronización.

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

¿Fue útil?

Solución

El puntero del objeto tipo se usa para representar el tipo del objeto. Esto es necesario para:

  • Método de búsqueda (la vtable)
  • Comprobando moldes
  • Encontrar el objeto Type si llama a GetType .

El campo syncblock se usa principalmente para bloquear. Solo se rellena cuando es necesario, y cuando una cerradura siempre está sin oposición, el CLR se las arregla con un '' delgado '' bloqueo que no requiere ningún dato externo. De lo contrario, es una entrada en una tabla de todo el proceso: no sé los detalles de lo que hay en la tabla, pero me imagino que son cosas como una lista de subprocesos que esperan en el monitor del objeto. Por supuesto, la información más importante es si el bloqueo se mantiene o no en ese momento, por qué subproceso y cuál es su recuento (debido a la naturaleza reentrante de los bloqueos .NET).

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

Otros consejos

Tipo de objeto es lo que devuelve obj.GetType call

bloque de sincronización utilizado para la sincronización

Ver:

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top