Inleiding

Geheugenbeheer is het proces van efficiënt toewijzen, de-alloceren en coördineren van geheugen, zodat alle verschillende processen soepel verlopen en optimaal toegang hebben tot de verschillende systeembronnen. Geheugenbeheer omvat ook het opschonen van het geheugen van objecten die niet langer worden benaderd.

In Python is de geheugenbeheerder verantwoordelijk voor dit soort taken door periodiek te draaien om het geheugen op te schonen, toe te wijzen, en te beheren. In tegenstelling tot C, Java en andere programmeertalen, beheert Python objecten door gebruik te maken van referentietelling. Dit betekent dat de geheugenbeheerder het aantal verwijzingen naar elk object in het programma bijhoudt. Wanneer de referentietelling van een object tot nul daalt, wat betekent dat het object niet langer wordt gebruikt, maakt de vuilnisman (onderdeel van de geheugenbeheerder) automatisch het geheugen van dat specifieke object vrij.

De gebruiker hoeft zich geen zorgen te maken over geheugenbeheer, omdat het proces van toewijzing en de-toewijzing van geheugen volledig automatisch verloopt. Het vrijgekomen geheugen kan door andere objecten worden gebruikt.

Python Garbage Collection

Zoals eerder uitgelegd, verwijdert Python objecten waarnaar in het programma niet meer wordt verwezen, om geheugenruimte vrij te maken. Dit proces waarbij Python blokken geheugen vrijmaakt die niet langer worden gebruikt, wordt Garbage Collection genoemd. De Python Garbage Collector (GC) loopt tijdens de uitvoering van het programma en wordt geactiveerd als het aantal verwijzingen tot nul daalt. Het aantal verwijzingen neemt toe als een object een nieuwe naam krijgt of in een container wordt geplaatst, zoals een tuple of dictionary. Evenzo neemt de referentietelling af als de verwijzing naar een object opnieuw wordt toegewezen, als de verwijzing naar het object buiten het bereik gaat, of als een object wordt verwijderd.

Het geheugen is een heap die objecten en andere gegevensstructuren bevat die in het programma worden gebruikt. De toewijzing en de-toewijzing van deze heap ruimte wordt gecontroleerd door de Python Memory manager door het gebruik van API-functies.

Python Objects in Memory

Elke variabele in Python fungeert als een object. Objecten kunnen eenvoudig zijn (met getallen, strings, enz.) of containers (woordenboeken, lijsten, of door de gebruiker gedefinieerde klassen). Bovendien is Python een dynamisch getypeerde taal, wat betekent dat we de variabelen of hun types niet hoeven te declareren voordat we ze in een programma gebruiken.

Voorbeeld:

Als je naar de eerste 2 regels van het bovenstaande programma kijkt, is object x bekend. Wanneer we het object x verwijderen en proberen te gebruiken, krijgen we een foutmelding dat de variabele x niet is gedefinieerd.

Je ziet dat de garbage collection in Python volledig geautomatiseerd is en dat de programmeur zich er geen zorgen over hoeft te maken, in tegenstelling tot talen als C.

Modifying the Garbage Collector

De Python garbage collector heeft drie generaties waarin objecten worden ingedeeld. Een nieuw object aan het beginpunt van zijn levenscyclus is de eerste generatie van de garbage collector. Naarmate het object de garbage collection overleeft, zal het naar de volgende generaties worden verplaatst. Elk van de 3 generaties van de vuilnisman heeft een drempel. Wanneer de drempel van het aantal allocaties min het aantal de0allocaties wordt overschreden, zal die generatie een garbage collection uitvoeren.

Erdere generaties worden ook vaker garbage collected dan de hogere generaties. Dit komt omdat nieuwere objecten eerder worden weggegooid dan oude objecten.

De gc module bevat functies om de drempelwaarde te veranderen, handmatig een garbage collection proces te starten, het garbage collection proces uit te schakelen, etc. We kunnen de drempelwaarden van verschillende generaties van de vuilnisman controleren met de get_threshold() methode:

import gcprint(gc.get_threshold())

Sample Output:

(700, 10, 10)

Zoals u ziet, hebben we hier een drempelwaarde van 700 voor de eerste generatie, en 10 voor elk van de andere twee generaties.

We kunnen de drempelwaarde voor het triggeren van het vuilnisophaalproces veranderen met de set_threshold() methode van de gc module:

gc.set_threshold(900, 15, 15)

In het bovenstaande voorbeeld hebben we de drempelwaarde voor alle 3 generaties verhoogd. Het verhogen van de drempelwaarde verlaagt de frequentie van het uitvoeren van de garbage collector. Normaal gesproken hoeven we als ontwikkelaar niet al te veel na te denken over Python’s garbage collection, maar dit kan nuttig zijn bij het optimaliseren van de Python runtime voor je doelsysteem. Een van de belangrijkste voordelen is dat Python’s garbage collection mechanisme veel low-level details voor de ontwikkelaar automatisch afhandelt.

Waarom handmatige garbage collection uitvoeren?

We weten dat de Python interpreter een track bijhoudt van referenties naar objecten die in een programma worden gebruikt. In eerdere versies van Python (tot versie 1.6), gebruikte de Python interpreter alleen het mechanisme van de referentietelling om met geheugen om te gaan. Wanneer de referentietelling tot nul daalt, maakt de Python interpreter automatisch het geheugen vrij. Dit klassieke mechanisme van verwijzingen tellen is zeer effectief, behalve dat het niet werkt wanneer het programma verwijzingscycli heeft. Een referentiecyclus ontstaat als een of meer objecten naar elkaar verwijzen, en dus de referentietelling nooit nul bereikt.

Laten we een voorbeeld bekijken.

>>> def create_cycle():... list = ... list.append(list)... return list... >>> create_cycle()]

De bovenstaande code creëert een referentiecyclus, waarbij het object list naar zichzelf verwijst. Daarom zal het geheugen voor het object list niet automatisch worden vrijgemaakt wanneer de functie terugkeert. Het probleem van de referentiecyclus kan niet worden opgelost door verwijzingen te tellen. Het probleem van de referentiecyclus kan echter worden opgelost door het gedrag van de vuilnisman in uw Python-toepassing te wijzigen.

Om dit te doen, kunnen we de functie gc.collect() van de module gc gebruiken.

import gcn = gc.collect()print("Number of unreachable objects collected by GC:", n)

De gc.collect() retourneert het aantal objecten dat het heeft verzameld en gedetalloceerd.

Er zijn twee manieren om handmatige garbage collection uit te voeren: time-based of event-based garbage collection.

Time-based garbage collection is vrij eenvoudig: de gc.collect() functie wordt aangeroepen na een vast tijdsinterval.

Gebeurtenis-gebaseerde vuilnisophaling roept de gc.collect()-functie aan nadat een gebeurtenis plaatsvindt (d.w.z. wanneer de toepassing wordt afgesloten of de toepassing gedurende een bepaalde tijd inactief blijft).

Laten we het handmatige vuilnisophaalwerk begrijpen door een paar referentiecycli te maken.

De uitvoer is als volgt:

Creating garbage...Collecting...Number of unreachable objects collected by GC: 8Uncollectable garbage: 

Het bovenstaande script maakt een lijstobject dat wordt verwezen door een variabele, creatief genaamd list. Het eerste element van het lijstobject verwijst naar zichzelf. Het aantal verwijzingen van het lijstobject is altijd groter dan nul, zelfs als het wordt verwijderd of buiten bereik is in het programma. Daarom wordt het object list niet opgehaald vanwege de circulaire verwijzing. Het garbage collector mechanisme in Python zal automatisch controleren op, en het verzamelen van, circulaire verwijzingen periodiek.

In de bovenstaande code, omdat het aantal verwijzingen ten minste 1 is en nooit 0 kan bereiken, hebben we de objecten geforceerd garbage collected door gc.collect() aan te roepen. Denk er echter aan dat je niet vaak geforceerde garbage collection moet doen. De reden hiervoor is dat zelfs na het vrijmaken van het geheugen, de GC tijd nodig heeft om te evalueren of het object in aanmerking komt voor garbage collection, wat processortijd en resources kost. Vergeet ook niet om de garbage collector pas handmatig te beheren nadat uw app volledig is opgestart.

Conclusie

In dit artikel hebben we besproken hoe geheugenbeheer in Python automatisch wordt afgehandeld door gebruik te maken van referentietellingen en garbage collection-strategieën. Zonder garbage collection is het implementeren van een succesvol geheugenbeheer mechanisme in Python onmogelijk. Ook hoeven programmeurs zich geen zorgen te maken over het verwijderen van toegewezen geheugen, omdat dit wordt verzorgd door de Python geheugenbeheerder. Dit leidt tot minder geheugenlekken en betere prestaties.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.