Python里的垃圾回收机制是什么意思,搞不懂?
迷茫
迷茫 2017-04-18 09:43:39
0
4
564

简单的例子来说一说Python里的垃圾回收机制,O(∩_∩)O谢谢。

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

répondre à tous(4)
黄舟

Algorithmes GC courants

Nombre de références

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

.
Ty80

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...

Ty80

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 :

  1. Simple

  2. En temps réel

Inconvénients :

  1. Maintenir le comptage de références consomme des ressources

  2. 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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!