Maison > Article > développement back-end > Introduction détaillée au mécanisme de récupération de place Python
PythonLe mécanisme de récupération de place par défaut est le "comptage de références", et chaque objet maintient un champ ob_ref . Son avantage est que son mécanisme est simple. Lorsqu'une nouvelle référence pointe vers l'objet, le compteur de références est augmenté de 1. Lorsque la référence d'un objet est détruite, elle est diminuée de 1. Une fois que le compteur de références de l'objet est égal à 0. , l'objet est immédiatement recyclé et la mémoire occupée sera libérée. Son inconvénient est qu'il nécessite un espace supplémentaire pour maintenir le décompte des références, mais le principal problème est qu'il ne peut pas résoudre les "cycliques références".
Qu'est-ce qu'une référence circulaire ? A et B se réfèrent l'un à l'autre et il n'y a aucune référence externe à A ou à B. Bien que leurs nombres de références soient tous deux égaux à 1, ils doivent évidemment être recyclés. Exemple :
a = { } # a 的引用为 1 b = { } # b 的引用为 1 a['b'] = b # b 的引用增 1,b的引用为2 b['a'] = a # a 的引用增 1,a的引用为 2 del a # a 的引用减 1,a的引用为 1 del b # b 的引用减 1, b的引用为 1
Dans cet exemple, del The. L'instruction réduit le nombre de références de a et b et supprime le nom de la variable utilisé comme référence. Cependant, puisque les deux objets contiennent chacun une référence à l'autre objet, bien que les deux derniers objets ne soient pas accessibles par leur nom, Mais le nombre de références ne diminue pas jusqu’à zéro. Cet objet ne sera donc pas détruit, il résidera toujours en mémoire, ce qui provoque une fuite mémoire. Afin de résoudre le problème des références circulaires, Python a introduit deux mécanismes GC : le mark-sweep et la collection générationnelle.
Mark-Sweep est un algorithme de garbage collection basé sur la technologie de traçage et de recyclage. Les objets sont connectés via des références (pointeurs). Ensemble, ils forment un graphe orienté, les objets constituent les nœuds de. ce graphe orienté, et des relations de référence constituent les arêtes de ce graphe orienté. En partant de l'objet racine (racine objet), parcourez l'objet le long du bord dirigé . Les objets accessibles sont marqués comme objets utiles, et les objets inaccessibles sont les objets à effacer. Les objets dits racine sont des objets de référence globaux et des références dans la pile fonction . Les objets référencés par ces références ne peuvent pas être supprimés.
Marquez l'algorithme d'effacement car la technologie auxiliaire de récupération de place de Python traite principalement certains objets conteneurs, tels que list, dict, tuple, instance, etc., car pour string , il est impossible que les objets numériques provoquent des problèmes de référence circulaire. Python utilise une liste doublement chaînée pour organiser ces objets conteneurs.
Le recyclage générationnel est une méthode d'opération qui échange de l'espace contre du temps. Python divise la mémoire en différentes collections en fonction de la durée de survie de l'objet. Python divise la mémoire en 3 "générations", à savoir la jeune génération (0ème génération), la génération intermédiaire (1ère génération) et l'ancienne génération (2ème génération). Elles correspondent à 3 listes chaînées, et leurs fréquences de garbage collection diminuent au fur et à mesure. la durée de survie de l'objet augmente. Les objets nouvellement créés seront alloués dans la jeune génération lorsque le nombre total de listes chaînées de jeune génération atteint la limite supérieure, le mécanisme de récupération de place de Python sera déclenché pour recycler les objets qui peuvent être recyclés et les objets qui ne le seront pas. sera déplacé vers Aller au moyen âge, et ainsi de suite. Les objets de la vieillesse sont les objets qui ont survécu le plus longtemps, même au sein du cycle de vie de l'ensemble du système. Dans le même temps, le recyclage générationnel repose sur la technologie du marquage et du balayage.
Le recyclage générationnel sert également de technologie auxiliaire de collecte des déchets de Python pour traiter ces objets conteneurs
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!