Senior
Comment se fait la division des objets dans les tas?
sobes.tech IA
Réponse de l'IA
Dans .NET, le tas (heap) est divisé en deux générations principales : Génération 0 et Génération 1. Si nécessaire, la Génération 2 est créée.
- Génération 0 (Gen 0): Les objets nouvellement créés y sont placés. C'est la génération la plus jeune et la plus petite. Le ramasse-miettes (GC) vérifie et nettoie cette génération plus fréquemment. Les objets qui survivent à la collecte en Gen 0 sont déplacés vers Gen 1.
- Génération 1 (Gen 1): Contient des objets ayant survécu à la collecte en Gen 0. Le GC vérifie cette génération moins fréquemment que Gen 0. Les objets qui survivent à la collecte en Gen 1 sont déplacés vers Gen 2.
- Génération 2 (Gen 2): Contient des objets de longue durée de Gen 1, ainsi que de grands objets. Le GC vérifie cette génération le moins souvent. La collecte en Gen 2 est la plus coûteuse en temps.
- Tas pour objets volumineux (LOH): Zone spéciale du tas pour les objets de 85 Ko ou plus. Les objets dans LOH ne sont pas déplacés par le GC, car leur déplacement est très coûteux. Le nettoyage de LOH se fait en même temps que la collecte de Gen 2.
La division en générations repose sur l'hypothèse que les objets récemment créés deviennent plus rapidement des déchets que ceux de longue durée. Cette approche permet au GC de nettoyer efficacement la mémoire en se concentrant sur les générations les plus jeunes.
// Exemple de création d'objets en Génération 0
object obj1 = new object();
string str1 = "Hello";
// Après la première collecte de Gen 0, si obj1 et str1 sont toujours nécessaires,
// ils peuvent être déplacés en Génération 1.
// Objet de longue durée
List<int> longLivedList = new List<int>();
for (int i = 0; i < 1000; i++)
{
longLivedList.Add(i);
}
// Cette liste peut monter en Génération 2 avec le temps.
// Objet volumineux, placé dans LOH
byte[] largeArray = new byte[100 * 1024]; // Taille > 85 Ko