2010-02-13 5 views

Répondre

37

De Understanding Garbage Collection in .NET

Générations

Un garbage collector génération rassemble les objets de courte durée plus fréquemment que ceux vivaient plus longtemps. objets éphémères sont stockés dans la première génération , génération 0. Les objets à long terme sont poussé dans les générations plus, 1 ou 2. Le garbage collector travaille plus fréquemment dans les générations inférieures que dans le les plus élevés.

Lorsqu'un objet est créé, il est mis en génération 0. Lorsque la génération 0 est rempli, le collecteur des ordures est invoquée. Les objets qui survivre à la collecte des ordures dans la première génération sont promus sur la prochaine génération ultérieure, génération 1. Les objets qui survivent à la collecte des ordures dans la génération 1 sont promus à la suivante et la plus haute génération, génération 2 Cet algorithme fonctionne efficacement pour garbage collection d'objets, car est rapide. Notez que la génération 2 est la génération la plus élevée qui est pris en charge par le garbage collector.

Garbage Collection in .NET

Générations

Bien que l'allocation de mémoire sur le tas managé est rapide, GC se peut prendre un certain temps. Dans cet esprit plusieurs optimisations ont été faites pour améliorer les performances. Le GC soutient le concept des générations, basé sur l'hypothèse que le plus longtemps un objet a été sur le tas, plus il restera probablement là. Lorsqu'un objet est alloué sur , le tas appartient à la génération 0. Chaque garbage collection que l'objet survit augmente sa génération par 1 (actuellement la génération la plus élevée est 2). De toute évidence il est plus rapide de recherche à travers, de sorte que le GC a la possibilité de collecte seule génération 0, 1 ou 2 objets (ou tout autre combinaison, et ordures recueillir un sous-ensemble de tous objets sur le tas, il choisit jusqu'à ce qu'il ait mémoire suffisante). Même si ne collecte que des objets plus jeunes, le GC peut également déterminer si les anciens objets ont références à de nouveaux objets pour s'assurer qu'il n'ignore pas par inadvertance les objets en cours d'utilisation .

17

Il y a une belle description dans "Pro C# 2008":

  1. Génération 0 identifie un objet nouvellement créé qui n'a jamais été marqué pour la collecte
  2. Génération 1 identifie un objet qui a survécu à un GC (marqué pour la collecte mais pas pour le retrait, car l'espace mémoire était suffisant)
  3. La génération 2 identifie un objet qui a survécu à plusieurs balayages du CPG.
+0

Salut, pouvez-vous me dire quand le collecteur recueille les objets? Après l'exécution de chaque méthode? – Bigeyes

+0

Il n'est pas approprié de poser une question comme un commentaire dans une question de 7 ans. Chaque tutoriel Java vous dira que le GC fonctionne sur un thread séparé au moment de son choix. – duffymo

+0

@duffymo et qu'est-ce que le tutoriel Java a à voir avec la question de Bigeyes? De ma question d'OP saisissante est sur. Net – MaLiN2223

5

Mon premier répond blog de votre question: Generations of Garbage Allocation

Ajouter les informations sur le lien:

Le collecteur de Garbage CLR (GC) est un éboueur de génération, également connu sous le garbage collector ephermal.

Il dispose de trois générations:

Génération 0: Il contient tous les objets nouvellement construit qui ne sont jamais examinés par GC.

Generation 1: Le CLR, lorsque initialise, sélectionne une taille de budget kb pour la génération 0. Si la création d'un objet force la génération 0 à dépasser son budget, la récupération de place est démarrée. Les objets qui ne sont pas collectés dans la génération 0 sont déplacés vers la génération 1 et la génération 0 est vidée. Supposons que le budget de la génération 0 soit égal à la taille de 5 objets. Donc, la génération 0 ressemblerait ci-dessous avant la création de l'objet 6:

enter image description here

Après la création de l'objet 6, l'allocation des ordures permet de démarrer ce qui libère les objets ordures 1, 3 et 5 et se déplace 2 et 4 adjacents à chaque dans d'autres générations 1.

enter image description here

La taille du budget de génération 1 est également sélectionnée par CLR lors de l'initialisation. Création d'objet 11 provoque le GC de commencer à nouveau qui peut se déplacer un peu plus d'objets à la génération 1.

enter image description here

Generation 1 est ignoré pour la collecte des ordures jusqu'à ce qu'il atteigne la taille du budget de pour la collecte des ordures, ce qui améliore les performances de GC.

Génération 2:

Au cours de la génération 0 plusieurs collection, génération 1 peut dépasser la limite budgétaire de ce qui cause GC de recueillir les ordures des deux générations. Dans ce cas, les survivants de la génération 1 sont promus à la génération 2, les survivants de la génération 0 sont promus à la génération 1, et la génération 0 est vide.

Supposons que l'objet d'allocation 21 cause l'échec de la récupération de place et le budget de génération 1. enter image description here

Alors tas ressemblerait ci-dessous avec l'objet qui a survécu à la génération 1 promu à la génération 2.

enter image description here

Donc, fondamentalement, Génération GC suppose que les objets les plus récents ont plus de probabilité de collecte.

Nous savons que CLR sélectionne les budgets pour les trois générations, mais il peut les modifier car GC est un collecteur à réglage automatique. Si GC constate qu'il y a très peu d'objets survivants après avoir collecté la génération 0, il peut décider de réduire le budget de la génération 0, de sorte que le travail soit moindre. D'un autre côté, si GC collecte la génération 0 et constate qu'il y a beaucoup d'objets survivants, il n'y a pas beaucoup de mémoire récupérée dans le garbage collection. Dans ce cas, le garbage collector augmentera le budget de la génération 0. Le GC modifie également les budgets des générations 1 et 2 en conséquence.

+0

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et fournir le lien pour référence. Les réponses à lien uniquement peuvent devenir invalides si la page liée change. - [De l'examen] (/ review/low-quality-posts/17323312) – 1ac0

+1

Copié le contenu du blog pour répondre. –

+1

@DeepakMishra merci d'avoir édité votre réponse. Il a l'air bien maintenant et l'effort est vraiment apprécié. – g00glen00b