Sobes.tech
Middle+

¿Para qué sirve la separación del montón de objetos grandes (Large Object Heap) y del montón de objetos pequeños (Small Object Heap) en .NET?

sobes.tech AI

Respuesta de la IA

La separación del montón LOH y SOH en .NET optimiza la gestión de memoria para objetos de diferentes tamaños.

Small Object Heap (SOH)

  • Almacena objetos de hasta 85 KB.
  • Utiliza un recolector de basura generacional (Generational Garbage Collection - GC).
  • Los objetos creados recientemente caen en la generación 0. Los objetos que sobreviven se mueven a la generación 1, y luego a la generación 2.
  • La recolección de basura ocurre con más frecuencia y es más eficiente para objetos pequeños.
// Ejemplo de creación de un objeto en SOH
string smallString = "Esta es una cadena pequeña"; // Menor de 85 KB
object smallObject = new object(); // Objeto pequeño

Large Object Heap (LOH)

  • Almacena objetos de 85 KB o más.
  • No es generacional en el mismo sentido que SOH. Normalmente se limpia solo durante una recolección completa de basura (generación 2).
  • La asignación de memoria en LOH puede ser más lenta debido a la búsqueda de un bloque de memoria contiguo.
  • La fragmentación del LOH puede causar problemas al asignar objetos grandes, incluso si hay suficiente memoria libre en total.
  • Los objetos en LOH no se mueven por GC por defecto (con .NET Framework 4.5.1 se introdujo la opción de comprimir LOH, pero está desactivada por defecto y tiene sus costos). Esto evita costosas copias de grandes volúmenes de datos.
// Ejemplo de creación de un objeto en LOH
byte[] largeArray = new byte[100 * 1024]; // Tamaño 100 KB > 85 KB

Ventajas de la separación

  1. Optimización de la recolección de basura: El GC generacional en SOH es mucho más eficiente para objetos pequeños y de corta duración. Mover objetos a SOH es relativamente rápido.
  2. Reducción de la fragmentación en SOH: Mover objetos grandes sería muy costoso y causaría una fuerte fragmentación en SOH. Colocarlos en un montón separado, LOH, resuelve este problema.
  3. Minimización de costos adicionales: Mover objetos grandes a LOH implicaría costos significativos. La no migración por GC (por defecto) evita esto.
  4. Mejora en el rendimiento de asignación de memoria: La asignación en SOH suele ser muy rápida (con punteros), mientras que en LOH puede requerir buscar un bloque libre adecuado. La separación ayuda a mantener una alta velocidad de asignación para la mayoría de los objetos (pequeños).
Característica Small Object Heap (SOH) Large Object Heap (LOH)
Tamaño del objeto Hasta 85 KB 85 KB o más
Modelo de GC Generacional (generaciones 0, 1, 2) No generacional (por defecto)
Movimiento de objetos Sí (compactación) No (por defecto)
Frecuencia de limpieza Más frecuente Menos frecuente (generalmente con generación 2)
Riesgo de fragmentación Bajo (se compacta) Alto