Middle+
À quoi sert la séparation du tas des grands objets (Large Object Heap) et du tas des petits objets (Small Object Heap) dans .NET?
sobes.tech IA
Réponse de l'IA
La séparation du tas LOH et SOH dans .NET optimise la gestion de la mémoire pour des objets de tailles différentes.
Small Object Heap (SOH)
- Stocke des objets jusqu'à 85 Ko.
- Utilise un ramasse-miettes générationnel (Generational Garbage Collection - GC).
- Les objets récemment créés tombent dans la génération 0. Les objets survivants sont déplacés vers la génération 1, puis vers la génération 2.
- La collecte des déchets se produit plus fréquemment et est plus efficace pour les petits objets.
// Exemple de création d'un objet dans SOH
string smallString = "Ceci est une petite chaîne"; // Moins de 85 Ko
object smallObject = new object(); // Petit objet
Large Object Heap (LOH)
- Stocke des objets de 85 Ko ou plus.
- N'est pas générationnel dans le même sens que SOH. Il est généralement nettoyé uniquement lors d'une collecte complète (génération 2).
- L'allocation de mémoire sur le LOH peut être plus lente en raison de la recherche d'un bloc mémoire contigu.
- La fragmentation du LOH peut causer des problèmes lors de l'allocation de grands objets, même si la mémoire libre totale est suffisante.
- Les objets sur le LOH ne sont pas déplacés par le GC par défaut (avec .NET Framework 4.5.1, il est possible de compresser le LOH, mais cela est désactivé par défaut et a ses coûts). Cela évite des copies coûteuses de grandes quantités de données.
// Exemple de création d'un objet sur le LOH
byte[] largeArray = new byte[100 * 1024]; // Taille 100 Ko > 85 Ko
Avantages de la séparation
- Optimisation de la collecte de déchets: Le GC générationnel sur le SOH est beaucoup plus efficace pour les petits objets à courte durée de vie. Déplacer des objets vers le SOH est relativement rapide.
- Réduction de la fragmentation du SOH: Déplacer de grands objets serait très coûteux et entraînerait une forte fragmentation du SOH. Les placer sur un tas séparé, le LOH, résout ce problème.
- Minimisation des coûts supplémentaires: Déplacer de grands objets vers le LOH entraînerait des coûts importants. La non-migration par le GC (par défaut) évite cela.
- Amélioration des performances d'allocation mémoire: L'allocation dans le SOH est souvent très rapide (avec un pointeur), tandis que sur le LOH, il peut être nécessaire de rechercher un bloc libre approprié. La séparation permet de maintenir une vitesse d'allocation élevée pour la majorité des objets (petits).
| Caractéristique | Small Object Heap (SOH) | Large Object Heap (LOH) |
|---|---|---|
| Taille de l'objet | Jusqu'à 85 Ko | 85 Ko ou plus |
| Modèle de GC | Générationnel (générations 0, 1, 2) | Non générationnel (par défaut) |
| Déplacement d'objets | Oui (compactage) | Non (par défaut) |
| Fréquence de nettoyage | Plus fréquent | Moins fréquent (généralement avec génération 2) |
| Risque de fragmentation | Faible (se compacte) | Élevé |