Sobes.tech
Senior

¿Cómo se realiza la división de objetos en las pilas?

sobes.tech AI

Respuesta de la IA

En .NET, la pila (heap) se divide en dos generaciones principales: Generación 0 y Generación 1. Cuando es necesario, se crea la Generación 2.

  • Generación 0 (Gen 0): Los objetos recién creados se colocan aquí. Es la pila más joven y pequeña. El recolector de basura (GC) verifica y limpia esta generación con mayor frecuencia. Los objetos que sobreviven a la recolección en Gen 0 se mueven a Gen 1.
  • Generación 1 (Gen 1): Contiene objetos que han sobrevivido a la recolección en Gen 0. El GC verifica esta generación con menos frecuencia que Gen 0. Los objetos que sobreviven a la recolección en Gen 1 se mueven a Gen 2.
  • Generación 2 (Gen 2): Contiene objetos de larga duración de Gen 1, así como objetos grandes. El GC verifica esta generación con menos frecuencia. La recolección en Gen 2 es la más costosa en tiempo.
  • Heap de objetos grandes (LOH): Área especial de la pila para objetos de 85 KB o más. Los objetos en LOH no se mueven por el GC, ya que moverlos es muy costoso. La limpieza de LOH ocurre junto con la recolección de Gen 2.

La división en generaciones se basa en la hipótesis de que los objetos creados recientemente se vuelven basura más rápidamente que los de larga duración. Este enfoque permite que el GC limpie la memoria de manera eficiente, enfocándose en las generaciones más jóvenes.

// Ejemplo de creación de objetos en la Generación 0
object obj1 = new object();
string str1 = "Hello";

// Después de la primera recolección de basura en Gen 0, si obj1 y str1 aún son necesarios,
// pueden ser movidos a la Generación 1.

// Objeto de larga duración
List<int> longLivedList = new List<int>();
for (int i = 0; i < 1000; i++)
{
    longLivedList.Add(i);
}
// Esta lista con el tiempo puede subir a la Generación 2.

// Objeto grande, que será colocado en LOH
byte[] largeArray = new byte[100 * 1024]; // Tamaño > 85 KB