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
- 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.
- 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.
- Minimización de costos adicionales: Mover objetos grandes a LOH implicaría costos significativos. La no migración por GC (por defecto) evita esto.
- 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 |