Afvalinzameling in Python is een automatisch proces dat geheugentoewijzing en -deallocatie afhandelt, waardoor een efficiënt gebruik van geheugen wordt gegarandeerd. In tegenstelling tot talen zoals C of C++ waarbij de programmeur handmatig geheugen moet toewijzen en de toewijzing ervan ongedaan moet maken, beheert Python automatisch het geheugen via twee primaire strategieën:
- Referentie tellen
- Afvalinzameling
Referentie tellen
Python gebruikt referentie tellen om het geheugen te beheren. Van elk object wordt bijgehouden hoeveel verwijzingen ernaar verwijzen. Wanneer het aantal referenties naar nul daalt, d.w.z. er zijn geen referenties meer, maakt Python de toewijzing van het object automatisch ongedaan. Voorbeeld:
Pythonimport sys x = [1 2 3] print(sys.getrefcount(x)) y = x print(sys.getrefcount(x)) y = None print(sys.getrefcount(x))
Uitvoer
2 3 2
Uitleg:
- X Er wordt aanvankelijk twee keer naar verwezen (een keer door x, een keer door getrefcount()).
- Toewijzen y = x verhoogt het aantal.
- Instelling y = Geen verwijdert één verwijzing.
Probleem met referentietelling
Het tellen van referenties mislukt in de aanwezigheid van cyclische referenties, dat wil zeggen objecten die in een cyclus naar elkaar verwijzen. Zelfs als niets anders daarop wijst, bereikt hun referentietelling nooit nul. Voorbeeld:
Pythonimport sys x = [1 2 3] y = [4 5 6] x.append(y) y.append(x) print(sys.getrefcount(x)) print(sys.getrefcount(y))
Uitvoer
3 3
Uitleg:
- X bevat En En En bevat X .
- Zelfs na het verwijderen X En En Python zal het geheugen niet kunnen vrijmaken door alleen maar referentietellingen te gebruiken, omdat de ene nog steeds naar de andere verwijst.
Afvalinzameling voor Cyclische Referenties
Afvalinzameling is een geheugenbeheertechniek die in programmeertalen wordt gebruikt om automatisch geheugen terug te winnen dat niet langer toegankelijk of in gebruik is door de applicatie. Om dergelijke kringverwijzingen af te handelen gebruikt Python a Afvalverzamelaar (GC) van de ingebouwde gc-module. Deze verzamelaar kan objecten die betrokken zijn bij referentiecycli detecteren en opruimen.
Generatieafvalinzameling
Python's Generational Garbage Collector is ontworpen om met cyclische referenties om te gaan. Het organiseert objecten in drie generaties op basis van hun levensduur:
- Generatie 0: Nieuw gemaakte objecten.
- Generatie 1: Objecten die één verzamelcyclus hebben overleefd.
- Generatie 2: objecten met een lange levensduur.
Wanneer er referentiecycli optreden, detecteert de garbage collector deze automatisch en ruimt deze op, waardoor geheugen wordt vrijgemaakt.
Automatische afvalinzameling van cycli
De afvalinzameling wordt automatisch uitgevoerd wanneer het aantal toewijzingen het aantal deallocaties met een bepaalde drempel overschrijdt. Deze drempel kan worden geïnspecteerd met behulp van de gc-module.
Pythonimport gc print(gc.get_threshold())
Uitvoer
(2000 10 10)
Uitleg: Het retourneert de drempelwaarde-tuple voor generaties 0, 1 en 2. Wanneer toewijzingen de drempelwaarde overschrijden, wordt de verzameling geactiveerd.
Handmatige afvalinzameling
Soms is het nuttig om de garbage collector handmatig aan te roepen, vooral in het geval van referentiecycli. Voorbeeld:
Pythonimport gc # Create a cycle def fun(i): x = {} x[i + 1] = x return x # Trigger garbage collection c = gc.collect() print(c) for i in range(10): fun(i) c = gc.collect() print(c)
Uitvoer
0 10
Uitleg:
- zeker leuk(ik) creëert een cyclische verwijzing door zelf een woordenboekverwijzing te maken.
- gc.collect() activeert de garbagecollection en slaat het aantal verzamelde objecten op (aanvankelijk 0).
- voor ik binnen bereik(10) oproepen leuk(ik) 10 keer 10 cyclische referenties creëren.
- gc.collect() activeert de afvalinzameling opnieuw en drukt het aantal verzamelde cycli af.
Soorten handmatige afvalinzameling
- Op tijd gebaseerde afvalinzameling: De garbage collector wordt met vaste tijdsintervallen geactiveerd.
- Op gebeurtenissen gebaseerde afvalinzameling: De garbage collector wordt aangeroepen als reactie op specifieke gebeurtenissen, zoals wanneer een gebruiker de applicatie afsluit of wanneer de applicatie inactief wordt.
Gedwongen afvalophaling
Python's garbage collector (GC) wordt automatisch uitgevoerd om ongebruikte objecten op te ruimen. Om het handmatig te forceren, gebruikt u gc.collect() uit de gc-module. Voorbeeld:
Pythonimport gc a = [1 2 3] b = {'a': 1 'b': 2} c = 'Hello world!' del abc gc.collect()
Uitleg:
- uit de a b c verwijdert verwijzingen naar een b En C waardoor ze in aanmerking komen voor de afvalinzameling.
- gc.collect() dwingt garbagecollection om geheugen vrij te maken door objecten zonder referentie op te ruimen.
Afvalinzameling uitschakelen
In Python wordt de garbage collector automatisch uitgevoerd om objecten zonder referentie op te ruimen. Om te voorkomen dat het wordt uitgevoerd, kunt u het uitschakelen met gc.disable() uit de gc-module. Voorbeeld:
Pythonimport gc gc.disable() gc.enable()
Uitleg:
- gc.disable() schakelt de automatische afvalinzameling uit.
- gc.enable() schakelt automatische afvalinzameling opnieuw in.
Interactie met Python-garbagecollector
Een ingebouwd mechanisme genaamd de Python garbage collector elimineert automatisch objecten waarnaar niet langer wordt verwezen om geheugen vrij te maken en geheugenlekken te stoppen. De Python gc-module biedt een aantal manieren om te communiceren met de garbage collector, die vaak automatisch wordt uitgevoerd.
1. De garbage collector in- en uitschakelen: U kunt de garbage collector in- of uitschakelen met behulp van de gc. inschakelen() En gc. uitzetten() respectievelijk functies. Voorbeeld :
hernoem map linuxPython
import gc # Disable gc.disable() # Enable gc.enable()
2. Het forceren van afvalinzameling: U kunt handmatig een garbagecollection activeren met behulp van de gc. verzamelen() functie. Dit kan handig zijn in gevallen waarin u onmiddellijke afvalinzameling wilt forceren in plaats van te wachten tot de automatische afvalinzameling plaatsvindt. Voorbeeld:
Pythonimport gc gc.collect()
3. Instellingen van de afvalverzamelaar inspecteren: U kunt de huidige instellingen van de garbage collector inspecteren met behulp van de gc.get_threshold() functie die een tuple retourneert die de huidige drempelwaarden voor generaties 0 1 en 2 vertegenwoordigt. Voorbeeld:
Pythonimport gc t = gc.get_threshold() print(t)
Uitvoer
(2000 10 10)
4. Drempels voor afvalverzamelaars instellen: U kunt de drempelwaarden voor het ophalen van afval instellen met behulp van de gc.set_threshold() functie. Hierdoor kunt u de drempelwaarden voor verschillende generaties handmatig aanpassen, wat van invloed kan zijn op de frequentie van de afvalinzameling. Voorbeeld:
Pythonimport gc gc.set_threshold(500 5 5) t = gc.get_threshold() print(t)
Uitvoer
(500 5 5)
Voordelen en nadelen
Laten we enkele voor- en nadelen van Python's garbage collection onderzoeken.
Voordelen | Nadelen |
|---|---|
Automatisch geheugenbeheer | Kan prestatie-overhead introduceren |
Geen handmatige geheugenverwerking | Vereist begrip van geheugenconcepten |
Efficiënt opruimen via generaties | Beperkte controle over de timing van GC |
Aanpasbare GC-instellingen | Mogelijkheid van bugs of geheugenlekken |