Ligesom hjernen er afgørende for menneskers liv, er hukommelsen lige så vigtig for computere. Dit system kan ikke påtage sig opgaver, når det ikke har nok RAM.
RAM-mangel og nogle andre hukommelsesproblemer kan opstå på grund af hukommelseslækager. Derfor vil vi vise, hvordan du kan opdage hukommelseslækager og rette dem.
Men før det, lad os forstå mere om hukommelseslækager, og hvorfor skal du rette dem.
Indholdsfortegnelse
Hvad er hukommelseslækager?
Forestil dig en parkeringsplads lige ved siden af et indkøbscenter, hvor alle biler er parkeret, uanset om de handlende er færdige med deres indkøb eller ej. Med tiden vil der ikke være plads tilbage til nye køretøjer at parkere, hvilket fører til trafikspærringer og reducerer det samlede indkøbscenters effektivitet.
Billedkilde: prateeknima.medium.com
Det samme er tilfældet med computere!
Computerapplikationer, der ligner biler på en parkeringsplads, kan glemme at frigøre brugt hukommelse, når det ikke længere er nødvendigt. Dette belaster din hukommelse og efterlader ingen plads til, at nye opgaver kan køre problemfrit, hvilket resulterer i en almindelig hukommelsesfejl kaldet hukommelseslæk.
Et eksempel på kode til at vise hukommelseslækage:
void memory_allocation() { int *ptr = (int*)malloc(sizeof(int)); }
C-kodestykket ovenfor allokerer noget hukommelse til en heltalsvariabel og tildeler dens hukommelsesplacering til markøren ‘ptr’. Men der er ingen kode skrevet til at deallokere hukommelsen, hvilket fører til hukommelseslækager.
def infinite_rec(): return infinite_rec()
I ovenstående Python-kode er der ingen basiscase til at afslutte funktionen. Så ovenstående kode resulterer i stak overløb og hukommelseslækager.
Almindelige årsager til hukommelseslækager
Programmer Uagtsomhed
Den første årsag til en hukommelseslækage er programmørens uagtsomhed.
Programmerere tildeler ofte data til hukommelsen, men glemmer nogle gange at frigive dem, når de ikke længere er nødvendige. På et tidspunkt holder dette hele hukommelsen optaget og giver ikke plads til kommende opgaver, hvilket fører til, hvad vi kalder en ‘hukommelseslækage’-fejl.
Programmeringssprog
Brug af programmeringssprog uden indbygget hukommelsesstyringssystem kan forårsage hukommelseslækager.
Programmeringssprog som Java har indbyggede skraldeopsamlere til automatisk at tage sig af hukommelseshåndtering.
Men f.eks. har C++ ikke en indbygget skraldeopsamler. Du, programmøren, bør manuelt håndtere hukommelsen her, hvilket fører til hukommelseslækager, når du glemmer at rydde op i hukommelsen manuelt.
Tung cachebrug
Ofte brugte opgaver, data eller applikationer cachelagres for hurtigere adgang.
Dette kan føre til en hukommelseslækagefejl, hvis elementerne cachelagres, men ikke ryddes, selvom de er forældede eller ikke længere stemmer overens med dine nuværende brugsmønstre.
Brug af globale variabler
Globale variabler holder de allokerede data i hele applikationens levetid. Så brugen af mere globale variabler bruger meget hukommelse i længere tid og forårsager hukommelseslækager.
Ineffektive datastrukturer
Udviklere opretter ofte deres egne datastrukturer for at opnå brugerdefinerede funktioner. Dog dukker hukommelseslækagefejl op, når disse datastrukturer ikke kan deallokere den brugte hukommelse.
Ulukkede forbindelser
Ikke at lukke filer, databaser, netværksforbindelser osv. efter brug kan også føre til hukommelseslækagefejl.
Konsekvenser af hukommelseslækager
Lav ydeevne – Du vil se et gradvist fald i din applikations eller systems ydeevne, efterhånden som hukommelseslækager ophobes. Dette skyldes, at der ikke vil være nogen hukommelse tilgængelig for opgaver at udføre, hvilket gør din ansøgning langsommere.
Nedbrudte apps – Programmer løber tør for hukommelse, efterhånden som hukommelseslækager vokser. På et tidspunkt, uden hukommelse tilgængelig, går programmet ned, hvilket resulterer i datatab og programfejl.
Sikkerhedssårbarheder – Ikke korrekt sletning af følsomme data som adgangskoder, personlige detaljer eller fortrolige oplysninger fra hukommelsen efter brug afslører disse data for angribere under hukommelseslækager.
Ressourceudmattelse – Programmer optager mere plads fra din RAM, når de løber tør for hukommelse på grund af hukommelseslækager. Dette øger ressourceforbruget og reducerer den samlede systemydelse.
Hvordan opdager man hukommelseslækager?
Manuel kode inspektion
Undersøg din kildekode for at finde tilfælde, hvor hukommelsen er allokeret, men ikke ryddet efter brug. Se efter variabler og objekter i koden, der bruger hukommelse, men som ikke frigiver den, når den ikke længere er nødvendig.
Hold også øje med de vigtigste kilder til datalagring, dvs. sørg for, at datastrukturer administrerer den allokerede hukommelse godt.
Statisk kodeanalyse
Forskellige veldesignede statiske analyseværktøjer analyserer din compilerkildekode og opdager tilfælde af hukommelseslækage.
Nogle gange sporer de almindelige mønstre, regler og fejl i din kode for at gætte hukommelseslækager forude, selv før de opstår.
Dynamiske analyseværktøjer
Disse værktøjer bruger den dynamiske tilgang til at analysere koden under udførelse og detektere hukommelseslækager.
Dynamiske analyseværktøjer undersøger køretidsadfærden for objekter, funktioner og deres hukommelsesbrug. Dette er grunden til, at disse værktøjer er meget nøjagtige til at opdage hukommelseslækager.
Profileringsværktøjer
Profileringsværktøjer giver dig indsigt i, hvordan applikationen bruger hukommelsen.
Du, som udvikler, kan bruge disse oplysninger til at analysere programmets hukommelsesforbrug og optimere hukommelseshåndteringsteknikkerne for at forhindre programnedbrud og problemer med hukommelsesnedbrydning.
Biblioteker til registrering af hukommelseslækage
Nogle programmeringssprog tilbyder indbyggede biblioteker eller tredjepartsbiblioteker til at opdage hukommelseslækager i dit program.
For eksempel har Java en skraldeopsamler til at håndtere hukommelse, og C++ tilbyder CrtDbg til hukommelseshåndtering.
Også specialiserede biblioteker som LeakCanary, Valgrind, YourKit osv. adresserer hukommelseslækager i forskellige typer applikationer.
Hvordan rettes hukommelseslækage?
Identificer hukommelseslækager
For at rette hukommelseslækager skal du først identificere dem.
Du kan enten foretage en manuel inspektion eller bruge et eller andet automatisk værktøj til at opdage, om appen lækker hukommelse. Du kan prøve de andre hukommelseslækagedetektionsmetoder, der er nævnt ovenfor, for at opdage lækagen.
Identificer genstande, der forårsager lækagen
Når du har bekræftet, at appen lækker hukommelse i ovenstående trin, skal du kigge efter de objekter og datastrukturer, der forårsager lækagen. Forstå, hvordan de er tildelt hukommelse, og hvor de skal frigive hukommelsen.
Opret testcases
Nu har du indsnævret det nøjagtige sted for hukommelseslækage. Så opret en testcase for at sikre, at du har identificeret kilden til hukommelseslækagen korrekt, og for at bekræfte, at lækagen forsvinder, når du har rettet de specifikke objekter.
Ret koden
Tilføj hukommelsesdeallokeringskoden for at frigive den blokerede hukommelse af de identificerede defekte objekter. Hvis koden allerede findes, skal du opdatere koden for at sikre, at den tildeler den brugte hukommelse korrekt.
Test igen
Brug igen lækagedetektionsværktøjer eller automatiserede tests for at kontrollere, om applikationen fungerer efter hensigten, og om der ikke er nogen hukommelsesblokering.
Test også din applikations ydeevne og funktionalitet for at sikre, at kodeopdateringen ikke påvirker andre faktorer i appen.
Bedste praksis til at forhindre hukommelseslækager
Vær en ansvarlig programmør
Du bør være bevidst om at deallokere den brugte hukommelse eller frigive hukommelsesmarkørerne, mens du skriver selve koden. Dette vil minimere problemer med hukommelseslækage.
Husker du nedenstående kode? Som nævnt i begyndelsen af artiklen, er der ingen hukommelsesdeallokeringskodestykke, så det fører til en hukommelseslækage.
void memory_allocation() { int *ptr = (int*)malloc(sizeof(int)); }
Her er hvordan du som programmør kan deallokere hukommelsen.
delete ptr;
Brug udstyrede programmeringssprog
Programmeringssprog som Java eller Python anvender indbyggede hukommelseshåndteringsbiblioteker som skraldesamlere til automatisk at håndtere hukommelseslækager.
Selvom du overser nogle få tilfælde, håndterer disse indbyggede værktøjer dem og forhindrer potentielle hukommelseslækager.
Derfor anbefaler jeg, at du bruger sådanne programmeringssprog, hvor hukommelsesstyring er indbygget.
Cirkulære referencer
Undgå cirkulære referencer i dit program.
Cirkulære referencer følger en lukket løkke af objekter, der refererer til hinanden. For eksempel refererer objekt a til b, objekt b refererer til c, og objekt c henviser igen til a uden ende i løkken. Så cirkulære referencer fører til en uendelig løkke, hvilket forårsager hukommelseslækager.
Minimer brugen af globale variabler
Du bør undgå at bruge globale variabler, hvis du er bekymret for din hukommelseseffektivitet. Globale variabler opbruger din hukommelse gennem hele applikationens køretid, hvilket er en dårlig praksis i hukommelseshåndtering.
Så skift til lokale variabler. Disse er hukommelseseffektive, da de frigiver hukommelsen, når funktionsopkaldet er udført.
Globale variabler ser ud som følger, men brug dem kun, når det er nødvendigt.
int x = 5 // Global variable void func(){ print(x) }
Men brug lokale variabler som følger:
void func(){ int x = 5 // Local variable print(x) }
Begræns cachehukommelse
Indstil en grænse for den hukommelse, som cachen kan bruge. Nogle gange vil alle de opgaver, du udfører i systemet, blive skubbet til cachehukommelsen, og denne akkumulerede cachelagring fører til hukommelseslækager.
Så begrænsning af cachen kan forhindre hukommelseslækager i at opstå.
Test godt
Inkluder hukommelseslækagetests i din testfase.
Opret automatiserede tests og dæk alle kantene for at opdage hukommelseslækager, før du frigiver koden til produktion.
Udstyr overvågningsværktøjer
Brug automatiske profileringsværktøjer til at overvåge dit hukommelsesforbrug. At spore dit hukommelsesforbrug regelmæssigt hjælper dig med at identificere potentielle lækager og rette dem på forhånd.
Visual Studio profiler, NET Memory profiler og JProfiler er et par gode værktøjer i denne sammenhæng.
Konklusion
Effektiv hukommelsesstyring er nødvendig for at opnå applikationens højeste ydeevne, og hukommelseslækager kan ikke ignoreres i denne sammenhæng. For effektiv hukommelsesstyring bør du håndtere hukommelseslækager og forhindre dem i at opstå i fremtiden. Denne artikel handler om, hvordan du kan gøre dette.
Vi viste dig forskellige metoder til at opdage hukommelseslækager, dokumenterede trin til at rette dem og praksis, du kan følge for at undgå fremtidige hukommelseslækager.
Dernæst kan du også udforske, hvordan du løser fejlen “tom hukommelse” i Windows inden for 5 minutter.