Hukommelsestab

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 22. december 2020; checks kræver 11 redigeringer .

En hukommelseslækage er en  proces med ukontrolleret reduktion i mængden af ​​ledig RAM eller virtuel hukommelse på en computer forbundet med fejl i kørende programmer , der ikke frigiver hukommelse fra unødvendige data i tide, eller med fejl i systemhukommelseskontroltjenester.

Hvad er en hukommelseslækage

Overvej følgende C++ kodestykke :

char * pointer = NULL ; for ( int i = 0 ; i < 10 ; i ++ ) { pointer = ny char [ 100 ]; } slette [] pointer ;

Dette eksempel opretter et objekt i heap på 3. linje. Koden på 3. linje udføres 10 gange, og hver gang overskriver adressen på det nye objekt værdien gemt i markøren. På 5. linje slettes objektet, der blev oprettet ved sidste iteration af løkken. De første 9 objekter forbliver dog i dynamisk hukommelse, og samtidig er der ingen variable tilbage i programmet, som ville gemme adresserne på disse objekter. Det vil sige, i 5. linje er det umuligt at få adgang til eller slette de første 9 objekter.

Hvad er farerne ved hukommelseslækager

Dynamisk hukommelse er en begrænset ressource. Et programs dynamiske hukommelse administreres normalt af et programmeringssprogsbibliotek, der selv kører oven på den dynamiske hukommelse, som operativsystemet leverer.

Hukommelseslækager fører til, at programmets hukommelsesforbrug stiger ukontrolleret, som et resultat, før eller siden, træder de arkitektoniske begrænsninger af eksekveringsmiljøet ( operativsystem , virtuel maskine , computer ) i kraft, og derefter en ny allokering af hukommelsen bliver umulig. I denne situation går et program, der anmoder om hukommelse, normalt ned . Dette kan ved en tilfældighed ske med et helt andet program, efter at programmet, med forbehold for lækager, opbruger al computerens hukommelse.

Måder at forhindre

Der er forskellige måder at forhindre hukommelseslækager på.

Afvisning af dynamisk hukommelse

For eksempel opgiver FORTRAN-77 fuldstændigt brugen af ​​dynamiske hukommelsesallokeringsmekanismer, som eliminerer sådanne fejl, men begrænser programmernes funktionalitet betydeligt.

At eje pointere

At eje pointere giver dig mulighed for på en eller anden måde at blive enige om pointerens levetid og levetiden for det objekt, den refererer til. Det hjælper dog ikke at bruge pointers i tilfælde af cirkulære referencer mellem objekter. (for detaljer, se mønsteret " Ressourceanskaffelse er initialisering ")

Affaldsopsamling

Nogle programmeringssprog (for eksempel Oberon , Java , .NET platformsprog ) giver værktøjer til automatisk at frigøre ubrugt hukommelse (" garbage collector ", engelsk  garbage collector ). Skraldesamlere løser også problemet med cirkulære referencer, men affaldsindsamling er en ressourcekrævende operation. Omkostningerne ved at bruge sådanne værktøjer er systemhastighed, og vigtigst af alt introducerer affaldsindsamling uventede pauser i programmet, hvilket er uacceptabelt i realtidssystemer .

Garbage collection blev opfundet af John McCarthy omkring 1959 , mens han udviklede Lisp -programmeringssproget , hvis struktur gør manuel hukommelseshåndtering ekstremt vanskelig.

Genstart af programmet

I tilfælde, hvor det ikke er muligt at eliminere hukommelseslækager, for eksempel ved brug af kode leveret som plug-ins og lavet af tredjepartsudviklere, bruges en ejendommelig måde at ignorere lækager på. Den lækkede kode placeres i et separat program, og dette program genstartes med den nødvendige frekvens. Start og genstart af programmet udføres af et eksternt program, som også leverer de indledende data og tager resultaterne. Fordi når et program afsluttes, returneres al den hukommelse, det hævder fra operativsystemet, til operativsystemet, denne metode forhindrer lækager i at blive katastrofale.

Lækker andre ressourcer

Der er også en fejl kaldet Handle Leak : Fangede håndtag returneres ikke til operativsystemet.

For at bekæmpe konsekvenserne af sådanne fejl introducerer udviklere af operativsystemer funktionalitet i dem, der giver dem mulighed for at begrænse mængden af ​​hukommelse, antallet af håndtag og mængden af ​​processortid, der er tilgængelig for en bruger eller en bestemt proces.

Lækagedetektion

Til professionelle programmeringssprog findes der specielle profileringsprogrammer, som giver dig mulighed for at opdage blandt andet hukommelseslækager.

For nogle programmeringssprog er der statiske kodeanalysatorer , der identificerer programelementer, der potentielt kan føre til logiske fejl, herunder hukommelseslækager. En primitiv version af en sådan analysator implementeres af næsten enhver kompilator af et højt niveau sprog i form af at udstede såkaldte advarsler (advarsler) - beskeder om tilstedeværelsen i programmet af konstruktioner, der ikke formelt overtræder syntaksen for sproget, men er potentielt fejlagtige.

Der er biblioteker til fejlfinding af hukommelsesbrug, som hjælper dig med at overvåge hukommelsesallokering og -deallokering, mens programmet kører.

Se også

Links