[ Je voulais juste ajouter quelque chose sur les aspects internes du processus de finalisation ].
Ainsi, vous créez un objet et lorsque l'objet est collecté, la fonction Finalize
doit être appelée. Mais la finalisation ne se limite pas à cette simple hypothèse.
CONCEPTS COURTS : :
-
Objets ne mettant PAS en œuvre Finalize
méthodes, leur mémoire est récupérée immédiatement, à moins, bien sûr, qu'elles ne soient pas accessibles par les utilisateurs.
plus de code d'application
-
Objets mettant en œuvre Finalize
La méthode, le concept/la mise en œuvre de Application Roots
, Finalization Queue
, Freacheable Queue
vient avant qu'ils puissent être récupérés.
-
Tout objet est considéré comme un déchet s'il n'est PAS accessible par l'application. Code
Supposons : : Les classes/objets A, B, D, G, H N'implémentent PAS Finalize
Méthode et mise en œuvre de C, E, F, I, J Finalize
Méthode.
Lorsqu'une application crée un nouvel objet, l'opérateur new alloue la mémoire à partir du tas. Si le type de l'objet contient un Finalize
un pointeur sur l'objet est placé dans la file d'attente de finalisation. .
donc les pointeurs des objets C, E, F, I, J sont ajoutés à la file d'attente de finalisation.
Le site file d'attente de finalisation est une structure de données interne contrôlée par le garbage collector. Chaque entrée de la file d'attente pointe vers un objet qui devrait avoir son numéro d'enregistrement. Finalize
appelée avant que la mémoire de l'objet puisse être récupérée. La figure ci-dessous montre un tas contenant plusieurs objets. Certains de ces objets sont accessibles à partir de la méthode les racines de l'application et d'autres non. Lorsque les objets C, E, F, I et J ont été créés, l'infrastructure .Net détecte que ces objets ont des noms de domaine. Finalize
et les pointeurs vers ces objets sont ajoutés à l'objet file d'attente de finalisation .
Lorsqu'une GC se produit (1ère collecte), les objets B, E, G, H, I et J sont considérés comme des déchets. Parce que A, C, D, F sont toujours accessibles par le code d'application représenté par les flèches de la boîte jaune ci-dessus.
Le ramasseur d'ordures parcourt le file d'attente de finalisation à la recherche de pointeurs vers ces objets. Lorsqu'un pointeur est trouvé, il est retiré de la file de finalisation et ajouté à la file de libération. ("F-reachable").
Le site file d'attente détachable est une autre structure de données interne contrôlée par le garbage collector. Chaque pointeur de la structure file d'attente détachable identifie un objet qui est prêt à avoir son Finalize
appelé.
Après la collecte (1ère collecte), le tas géré ressemble à la figure ci-dessous. Explication donnée ci-dessous: :
1.) La mémoire occupée par les objets B, G, et H a été récupérée immédiatement car ces objets ne possédaient pas de méthode finalize qui devait être appelée .
2.) Cependant, la mémoire occupée par les objets E, I et J ne pouvait pas être récupérée car leur Finalize
n'a pas encore été appelée. L'appel de la méthode Finalize se fait par file d'attente freachable.
3.) A, C, D, F sont toujours accessibles par le code d'application représenté par les flèches de la boîte jaune ci-dessus. flèches de la boîte jaune ci-dessus, ils ne seront donc PAS collectés dans tous les cas. cas
Il existe un fil d'exécution spécial dédié à l'appel des méthodes Finalize. Lorsque la file d'attente est vide (ce qui est généralement le cas), ce thread dort. Mais lorsque des entrées apparaissent, ce thread se réveille, supprime chaque entrée de la file et appelle la méthode Finalize de chaque objet. Le ramasseur d'ordures compacte la mémoire récupérable et le thread d'exécution spécial vide la file d'attente des objets récupérables. freachable la file d'attente, en exécutant les Finalize
méthode. Voici enfin comment votre méthode Finalize est exécutée.
La prochaine fois que le ramasseur d'ordures est invoqué (2nd Collection), il constate que les objets finalisés sont vraiment des ordures, puisque les racines de l'application ne pointent pas vers eux et que l'objet file d'attente détachable ne pointe plus vers lui (il est VIDE aussi), Donc la mémoire pour les objets (E, I, J) sont simplement récupérés du tas. Voir la figure ci-dessous et la comparer avec la figure juste au-dessus
La chose importante à comprendre ici est que deux GCs sont nécessaires pour récupérer la mémoire utilisée par les objets qui nécessitent une finalisation . En réalité, plus de deux collections peuvent même être nécessaires puisque ces objets peuvent être promus à une génération plus ancienne.
NOTE: : Le site file d'attente détachable est considérée comme une racine, tout comme les variables globales et statiques sont des racines. Par conséquent, si un objet se trouve dans la file d'attente freachable, alors l'objet est atteignable et n'est pas un garbage.
Enfin, rappelez-vous que le débogage d'une application est une chose, le ramassage des déchets en est une autre et fonctionne différemment. Jusqu'à présent, vous ne pouvez pas SENTIR le ramassage des ordures en déboguant des applications, mais si vous souhaitez étudier le ramassage des ordures, vous pouvez obtenir les informations suivantes a commencé ici.
9 votes
Le GC ne libère pas immédiatement les instances lorsqu'elles sont hors de portée. Il le fait quand il pense que c'est nécessaire. Vous pouvez lire tout ce qui concerne le GC ici : msdn.microsoft.com/fr/US/library/vstudio/0xy59wtx.aspx
0 votes
@user1908061 (Pssst. Votre lien est cassé.)
0 votes
Quelques articles : GC | GC | GC | GC | GC | GC