2012-06-14 13 views
5
MyObject obj = new MyObject(); 

Sé que la palabra clave 'nueva' llamará al constructor e inicializará el objeto en el montón administrado.Lo que está sucediendo cuando doy MyObject obj = new MyObject()

Mi pregunta es cómo el CLR está haciendo lo siguiente.

  1. ¿Cómo se ejecuta la línea anterior por CLR?
  2. ¿Cómo se asigna la memoria al objeto por CLR?
  3. ¿Cómo CLR determina el tamaño del objeto?
  4. ¿Cómo CLr llegará a saberlo, si no hay espacio para asignar memoria para el objeto del montón?
+5

Le recomendaría que lea 'CLR via C#' - Jeffrey Richter para obtener una mejor visión – V4Vendetta

Respuesta

2

Cuando se crea un tipo de referencia (clase, delegado, interfaz, cadena u objeto), se asigna al montón ... La red tiene cuatro montones diferentes: (gen0, gen1, gen2) (Heap de objetos pequeños) y LOH (Large Object Heap). Todo lo que tiene 85k o menos va en uno de los primeros tres montones, dependiendo del tiempo de creación (movido de gen0 a gen1 a gen2, etc.). Los objetos de más de 85k se colocan en el LOH. El LOH nunca se compacta, por lo que eventualmente, las asignaciones del tipo que estoy haciendo eventualmente causarán un error OOM a medida que los objetos se dispersen en ese espacio de memoria. Estos se conocen como montones administrados.

Para crear un objeto, todo lo que necesita hacer es usar la nueva palabra clave; .NET se encargará de crear, inicializar y colocar el objeto en el montón correcto, y reservar cualquier memoria adicional necesaria. Después de eso, puedes olvidarte de ese objeto, porque no tienes que borrarlo cuando hayas terminado con él.

cuando crea un objeto de tipo de referencia utilizando una nueva palabra clave, se coloca en el montón y su referencia se utiliza principalmente en la pila actual. hay otras posibles fuentes donde el objeto podría ser utilizado como refrence:

  1. referencias a objetos estáticos globales/
  2. CPU registra
  3. referencias a objetos de finalización (más tarde)
  4. referencias de interoperabilidad (objetos .NET pasado a las llamadas COM/API)
  5. referencias pila (en su mayoría utilizados aquí)

Estos 5 son nodos raíz realidad GC de whe Se forma la jerarquía de referencias a objetos. Imagine la clásica clase Cliente, que generalmente tiene una colección que almacena clases de órdenes. Cuando se agrega un pedido a la colección de pedidos, la colección misma contiene una referencia al pedido agregado. Si la instancia de la clase Cliente también tenía una referencia de pila.

así es como se forma la jerarquía para un objeto complejo, así es como GC ve las referencias.

e: g. stack-reference para objeto Customer -> referencia al objeto List de pedidos -> pedidos individuales de referencia.

todo lo que suelte la referencia de estas 5 raíces es propenso a GC.

cómo la memoria se asigna a los objetos es poco complejo y Normalamente crecen por el tiempo como MKK como se especifica http://msdn.microsoft.com/en-us/magazine/cc163791.aspx

un ejemplo sencillo podría ser:

class MyClass 
{ 
    string Test="Hello world Wazzup!"; 
    byte[] data=new byte[86000]; 
} 

Es fácil asumir que el tamaño de MiClase cuando asignado incluye:

• 19 caracteres

• 86.000 bytes.

De hecho, el tamaño del objeto solo incluirá material de clase general y la memoria necesaria para almacenar los punteros a la cadena y al conjunto de bytes (variables de nivel de clase), que se asignan por separado a los montones. La cadena se asignará en el SOH, y su referencia de objeto en la instancia de la clase; la matriz de bytes se asignará al LOH, ya que es más grande que 85 KB.

SOH se pueden compactar y no habrá fragmentación en él, mientras que LOH puede tener fragmentación en la memoria.

Atentamente.

Cuestiones relacionadas