Minnesförlust

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 22 december 2020; kontroller kräver 11 redigeringar .

En minnesläcka är en  process för okontrollerad minskning av mängden ledigt RAM eller virtuellt minne i en dator som är associerad med fel i program som körs som inte frigör minne från onödiga data i tid, eller med fel i systemminneskontrolltjänster.

Vad är en minnesläcka

Tänk på följande C++- kodavsnitt :

char * pointer = NULL ; for ( int i = 0 ; i < 10 ; i ++ ) { pekare = nytt tecken [ 100 ]; } ta bort [] pekare ;

Det här exemplet skapar ett objekt i heap på den tredje raden. Koden på den 3:e raden exekveras 10 gånger, och varje gång skriver adressen till det nya objektet över värdet som lagrats i pekaren. På den femte raden raderas objektet som skapades vid den sista iterationen av slingan. De första 9 objekten finns dock kvar i dynamiskt minne, och samtidigt finns det inga variabler kvar i programmet som skulle lagra adresserna till dessa objekt. Det vill säga, på den 5:e raden är det omöjligt att komma åt eller ta bort de första 9 objekten.

Vilka är farorna med minnesläckor

Dynamiskt minne är en begränsad resurs. Ett programs dynamiska minne hanteras vanligtvis av ett programmeringsspråksbibliotek som självt körs ovanpå det dynamiska minnet som tillhandahålls av operativsystemet.

Minnesläckor leder till att programmets minnesförbrukning ökar okontrollerat, som ett resultat, förr eller senare, träder de arkitektoniska begränsningarna av exekveringsmiljön ( operativsystem , virtuell maskin , dator ) i kraft, och sedan en ny allokering av minnet blir omöjligt. I den här situationen kraschar vanligtvis ett program som begär minne . Detta kan av en slump hända ett helt annat program efter att programmet, med förbehåll för läckor, tömt allt minne i datorn.

Sätt att förhindra

Det finns olika sätt att förhindra minnesläckor.

Avvisande av dynamiskt minne

Till exempel överger FORTRAN-77 helt användningen av dynamiska minnesallokeringsmekanismer, vilket eliminerar sådana fel, men avsevärt begränsar programmens funktionalitet.

Att äga pekare

Genom att äga pekare kan du på något sätt komma överens om pekarens livslängd och livslängden för det objekt som den hänvisar till. Att använda ägande pekare hjälper dock inte vid cirkulära referenser mellan objekt. (för detaljer, se mönstret " Resursförvärv är initialisering ")

Sophämtning

Vissa programmeringsspråk (till exempel Oberon , Java , .NET-plattformsspråk ) tillhandahåller verktyg för att automatiskt frigöra oanvänt minne (" garbage collector ", engelsk  garbage collector ). Sophämtare löser också problemet med cirkulära referenser, men sophämtning är en resurskrävande verksamhet. Kostnaden för att använda sådana verktyg är systemhastighet, och viktigast av allt, sophämtning introducerar oväntade pauser i programmet, vilket är oacceptabelt i realtidssystem .

Garbage Collection uppfanns av John McCarthy runt 1959 när han utvecklade programmeringsspråket Lisp , vars struktur gör manuell minneshantering extremt svår.

Starta om programmet

I de fall det inte är möjligt att eliminera minnesläckor, till exempel när man använder kod som tillhandahålls som plug-ins och tillverkad av tredjepartsutvecklare, används ett märkligt sätt att ignorera läckor. Den läckta koden placeras i ett separat program, och detta program startas om med önskad frekvens. Starter och omstarter av programmet utförs av ett externt program, som också tillhandahåller initialdata och tar resultaten. Eftersom när ett program avslutas återförs allt minne som det gör anspråk på från operativsystemet till operativsystemet, den här metoden förhindrar läckor från att bli katastrofala.

Läcka andra resurser

Det finns också en bugg som heter Handle Leak : Infångade handtag returneras inte till operativsystemet.

För att bekämpa konsekvenserna av sådana fel introducerar operativsystemutvecklare funktionalitet i dem som tillåter dem att begränsa mängden minne, antalet handtag och mängden processortid som är tillgänglig för en användare eller en viss process.

Läcksökning

För professionella programmeringsspråk finns speciella profileringsprogram som låter dig upptäcka bland annat minnesläckor.

För vissa programmeringsspråk finns det statiska kodanalysatorer som identifierar programelement som potentiellt kan leda till logiska fel, inklusive minnesläckor. En primitiv version av en sådan analysator implementeras av nästan vilken kompilator som helst av ett högnivåspråk, i form av att utfärda så kallade varningar (varningar) - meddelanden om närvaron i programmet av konstruktioner som inte formellt bryter mot syntaxen för språket, men är potentiellt felaktiga.

Det finns bibliotek för felsökning av minnesanvändning som hjälper dig att övervaka minnesallokering och avallokering medan programmet körs.

Se även

Länkar