Maintenir un décompte de références pour chaque objet mémoire. Lorsqu'une nouvelle référence pointe vers un objet, le décompte de référence de l'objet est incrémenté de un. Lorsque la référence à l'objet est détruite, le décompte est décrémenté de un. Lorsque le décompte revient à zéro, l'objet occupé par. l'objet est recyclé des ressources mémoire.
Marquer-Effacer
Il est divisé en deux étapes, l'une consiste à marquer, c'est-à-dire à distinguer les objets indésirables qui ne seront plus utilisés de nombreux objets mémoire l'autre consiste à effacer, c'est-à-dire à effacer les objets marqués ; objets poubelles. Lors du marquage, vous devez déterminer l'ensemble racine des objets de mémoire. Tous les objets de l'ensemble sont accessibles. Si un objet de l'ensemble racine fait référence à d'autres objets, les objets référencés ne peuvent pas être marqués comme objets inutiles. Ensuite, à partir de l'ensemble racine, parcourez de manière récursive tous les objets auxquels l'ensemble racine peut accéder et marquez-les comme des objets non poubelles. Une fois le parcours terminé, les objets qui ne sont pas marqués sont des objets poubelles.
Collecter par générations
Selon une conclusion statistique, s'il s'avère qu'un objet mémoire n'est pas un déchet au cours d'un processus de marquage, alors la possibilité qu'il devienne un déchet à court terme est très faible. La collection générationnelle collecte les objets de mémoire qui n'ont pas été marqués comme objets de mémoire dans plusieurs processus de collecte de mémoire dans une autre zone - l'ancienne zone, c'est-à-dire que les objets de mémoire de cette zone sont plus anciens. Étant donné que la probabilité que les objets de mémoire dans les zones anciennes deviennent des déchets à court terme est très faible, la fréquence de collecte des déchets dans ces zones peut être réduite. En revanche, les objets dans les zones jeunes sont soumis à une collecte des déchets à haute fréquence. Cela améliore les performances globales du garbage collection.
Gestion de la mémoire en Python
Dans CPython, le cycle de vie de la plupart des objets est géré via le nombre de références de l'objet. Le comptage de références est le décompte de garbage collection le plus intuitif et le plus simple. Par rapport aux autres algorithmes GC traditionnels, son plus grand avantage réside dans les performances en temps réel, c'est-à-dire que toute mémoire sera recyclée immédiatement dès qu'aucune référence ne la pointe.
Cependant, le comptage de références présente deux défauts gênants :
Lorsqu'une référence circulaire se produit dans le programme, le décompte de références ne peut pas la détecter et l'objet mémoire référencé par le cycle devient une mémoire non recyclable, provoquant une fuite de mémoire. Par exemple :
list1 = []
list1.append(list1)
del list1
list1 se référence circulairement. Une fois la deuxième ligne exécutée, le GC de list1 devient 2. Une fois l'opération del exécutée, le compte de référence de list1 devient 1 et n'est pas réinitialisé à zéro. , l'espace mémoire de list1 n'a pas été libéré, provoquant une fuite de mémoire. Le maintien des décomptes de références nécessite des opérations supplémentaires.
Le nombre de références doit être modifié à chaque fois qu'un objet mémoire est référencé ou que la référence est détruite. Ce type d'opération est appelé footprint. Le nombre de références footprint est très élevé, ce qui affecte grandement les performances globales du programme.
Afin de résoudre le problème des références circulaires, CPython a spécialement conçu un module - GC module Sa fonction principale est de rechercher les objets indésirables avec des références circulaires et de les effacer. La mise en œuvre de ce module introduit en fait les deux technologies principales de collecte des déchets mentionnées précédemment : la suppression des marques et la collecte générationnelle.
Afin de résoudre le problème de performances du comptage de références et d'essayer d'obtenir la plus grande efficacité en matière d'allocation et de libération de mémoire, Python a également conçu un grand nombre de mécanismes de pool de mémoire.
Le garbage collection de Python utilise une méthode de comptage de références. Le principe du comptage de références peut être trouvé en ligne Les niveaux d'allocation Python suivants
En fait, il ne s’agit pas seulement de comptage de références, mais aussi de balayage de marques et de recyclage générationnel. Cet article de blog le résume très bien
Python GC utilise principalement le comptage de références pour suivre et recycler les déchets. Sur la base du comptage de références, « marquer et balayer » est utilisé pour résoudre le problème des références circulaires qui peuvent survenir dans les objets conteneurs, et la « collection générationnelle » est utilisée pour améliorer l'efficacité du garbage collection en échangeant de l'espace contre du temps.
1 nombre de références
PyObject est un contenu indispensable pour chaque objet, où ob_refcnt est utilisé comme décompte de référence. Lorsqu'un objet a une nouvelle référence, son ob_refcnt sera incrémenté, et lorsque l'objet le référençant est supprimé, son ob_refcnt sera décrémenté Lorsque le nombre de références atteint 0, la vie de l'objet est terminée.
Avantages :
Simple
En temps réel
Inconvénients :
Maintenir le comptage de références consomme des ressources
Référence circulaire
2 Mécanisme d'effacement des marques
L'idée de base est d'abord d'allouer à la demande, et lorsqu'il n'y a pas de mémoire libre, de partir des registres et des références sur la pile du programme, de parcourir le graphe composé d'objets comme nœuds et de références comme arêtes, et de marquer tous les objets accessibles. , puis nettoyez l'espace mémoire et libérez tous les objets non marqués.
Technologie de 3 générations
L'idée générale du recyclage générationnel est de diviser tous les blocs de mémoire du système en différentes collections en fonction de leur temps de survie. Chaque collection devient une "génération". La fréquence du garbage collection augmente avec la durée de survie du ". génération". Il augmente et diminue, et le temps de survie est généralement mesuré par le nombre de collectes de déchets nécessaires.
Python définit par défaut une collection d'objets sur trois générations. Plus le numéro d'index est grand, plus la durée de survie de l'objet est longue.
Algorithmes GC courants
Nombre de références
Marquer-Effacer
Collecter par générations
Gestion de la mémoire en Python
Dans CPython, le cycle de vie de la plupart des objets est géré via le nombre de références de l'objet. Le comptage de références est le décompte de garbage collection le plus intuitif et le plus simple. Par rapport aux autres algorithmes GC traditionnels, son plus grand avantage réside dans les performances en temps réel, c'est-à-dire que toute mémoire sera recyclée immédiatement dès qu'aucune référence ne la pointe.
Cependant, le comptage de références présente deux défauts gênants :
Lorsqu'une référence circulaire se produit dans le programme, le décompte de références ne peut pas la détecter et l'objet mémoire référencé par le cycle devient une mémoire non recyclable, provoquant une fuite de mémoire. Par exemple :
list1
se référence circulairement. Une fois la deuxième ligne exécutée, le GC delist1
devient 2. Une fois l'opérationdel
exécutée, le compte de référence delist1
devient 1 et n'est pas réinitialisé à zéro. , l'espace mémoire de list1 n'a pas été libéré, provoquant une fuite de mémoire.Le maintien des décomptes de références nécessite des opérations supplémentaires.
Le nombre de références doit être modifié à chaque fois qu'un objet mémoire est référencé ou que la référence est détruite. Ce type d'opération est appelé
footprint
. Le nombre de référencesfootprint
est très élevé, ce qui affecte grandement les performances globales du programme.Afin de résoudre le problème des références circulaires, CPython a spécialement conçu un module -
GC module
Sa fonction principale est de rechercher les objets indésirables avec des références circulaires et de les effacer. La mise en œuvre de ce module introduit en fait les deux technologies principales de collecte des déchets mentionnées précédemment : la suppression des marques et la collecte générationnelle.Afin de résoudre le problème de performances du comptage de références et d'essayer d'obtenir la plus grande efficacité en matière d'allocation et de libération de mémoire, Python a également conçu un grand nombre de mécanismes de pool de mémoire.
Le garbage collection de Python utilise une méthode de comptage de références. Le principe du comptage de références peut être trouvé en ligne Les niveaux d'allocation Python suivants
.En fait, il ne s’agit pas seulement de comptage de références, mais aussi de balayage de marques et de recyclage générationnel. Cet article de blog le résume très bien
.http://hbprotoss.github.io/po...
Python GC utilise principalement le comptage de références pour suivre et recycler les déchets. Sur la base du comptage de références, « marquer et balayer » est utilisé pour résoudre le problème des références circulaires qui peuvent survenir dans les objets conteneurs, et la « collection générationnelle » est utilisée pour améliorer l'efficacité du garbage collection en échangeant de l'espace contre du temps.
1 nombre de références
PyObject est un contenu indispensable pour chaque objet, où
ob_refcnt
est utilisé comme décompte de référence. Lorsqu'un objet a une nouvelle référence, sonob_refcnt
sera incrémenté, et lorsque l'objet le référençant est supprimé, sonob_refcnt
sera décrémenté Lorsque le nombre de références atteint 0, la vie de l'objet est terminée.Avantages :
Simple
En temps réel
Inconvénients :
Maintenir le comptage de références consomme des ressources
Référence circulaire
2 Mécanisme d'effacement des marques
L'idée de base est d'abord d'allouer à la demande, et lorsqu'il n'y a pas de mémoire libre, de partir des registres et des références sur la pile du programme, de parcourir le graphe composé d'objets comme nœuds et de références comme arêtes, et de marquer tous les objets accessibles. , puis nettoyez l'espace mémoire et libérez tous les objets non marqués.
Technologie de 3 générations
L'idée générale du recyclage générationnel est de diviser tous les blocs de mémoire du système en différentes collections en fonction de leur temps de survie. Chaque collection devient une "génération". La fréquence du garbage collection augmente avec la durée de survie du ". génération". Il augmente et diminue, et le temps de survie est généralement mesuré par le nombre de collectes de déchets nécessaires.
Python définit par défaut une collection d'objets sur trois générations. Plus le numéro d'index est grand, plus la durée de survie de l'objet est longue.